Utilizzando MSBuild 4.0, è possibile "semplificare" una proprietà contenente un percorso?

StackOverflow https://stackoverflow.com/questions/7354547

  •  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
È stato utile?

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
scroll top