Utilizzando MSBuild 4.0, è possibile "semplificare" una proprietà contenente un percorso?
-
28-10-2019 - |
Domanda
Supponiamo di avere una proprietà contenente
c:\workdir\project\wonder\subproj\..\..\common
e voglio ridurlo/semplificarlo
c:\workdir\project\common
Inoltre, vorrei anche poter ottenere un percorso relativo dalla directory corrente o specificata.
Utilizzando la stessa proprietà iniziale e la directory di lavoro corrente su
c:\workdir\project\wonder
Lo voglio ridotto a
..\common
Soluzione
La prima parte (risolvendo..'nel percorso) è relativamente semplice, puoi farlo solo usando funzioni di proprietà:
<PropertyGroup>
<Folder>c:\workdir\project\wonder\subproj\..\..\common</Folder>
</PropertyGroup>
<Message Text="Folder $(Folder)" />
<Message Text="Shortened path $([System.IO.Path]::GetFullPath($(Folder)))" />
Produzione:
Folder c:\workdir\project\wonder\subproj\..\..\common
Shortened path c:\workdir\project\common
La seconda parte - accorciando un percorso relativamente a un'altra - richiede l'uso di una funzione magica Uri.MakeRelativeUri()
e avvolgendolo all'interno di un attività in linea (o una libreria di attività esterne). Dichiara il tuo compito:
<UsingTask TaskName="RelativePath" TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<Target Required="true" />
<BaseDirectory Required="true" />
<Result Output="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs"><![CDATA[
Uri fromUri = new Uri(new DirectoryInfo(BaseDirectory).FullName
+ Path.DirectorySeparatorChar);
Uri toUri = new Uri(new DirectoryInfo(Target).FullName);
Uri relativeUri = fromUri.MakeRelativeUri(toUri);
Result = relativeUri.ToString().Replace('/', Path.DirectorySeparatorChar);
]]></Code>
</Task>
</UsingTask>
Quindi usalo come segue:
<PropertyGroup>
<Folder>c:\workdir\project\wonder\subproj\..\..\common</Folder>
<WorkingDir>c:\workdir\project\wonder</WorkingDir>
</PropertyGroup>
<Message Text="Folder $(Folder)" />
<Message Text="Base directory $(WorkingDir)" />
<RelativePath Target="$(Folder)" BaseDirectory="$(WorkingDir)">
<Output PropertyName="Relative" TaskParameter="Result"/>
</RelativePath>
<Message Text="Relative path $(Relative)" />
Produzione:
Folder c:\workdir\project\wonder\subproj\..\..\common
Base directory c:\workdir\project\wonder
Relative path ..\common
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow