2016-02-18 4 views
2

У меня есть ситуация, когда у меня есть пучок абсолютных путей, и я хотел бы их преобразовать в Относительно путей на основе другого каталога с MSBuild. Вот код, который у меня есть до сих пор:MSBuild: Как получить относительный путь к файлу, учитывая абсолютный?

<PropertyGroup> 
    <FromPath>$(Bar)</FromPath> 
</PropertyGroup> 
<ItemGroup> 
    <AbsolutePaths Include="@(Foo)" Exclude="@(Baz)" /> 
    <PathsRelativeToBar Include="@(AbsolutePaths->'???')" /> <!-- What goes here? --> 
</ItemGroup> 

Любая помощь была бы оценена, спасибо!

редактировать: Я нашел решение на C# -На в this StackOverflow вопрос, но я не знаю, как (или, если это возможно), чтобы преобразовать его в MSBuild.

+0

Если у вас есть абсолютный путь и относительный путь рабочего каталога, это может помочь: http://stackoverflow.com/questions/703281/getting-path-relative- to-the-current-working-directory – mojorisinify

+0

@mojorisinify Спасибо за помощь! Я уже видел это решение. К сожалению, я не совсем уверен, как перевести это на код MSBuild. –

ответ

2

Там является уроженцем функция в MSBuild называется "MakeRelative"

Вот как вы можете использовать его.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.5" > 
    <PropertyGroup> 
     <Bar>c:\temp\msbuild-sample\2</Bar> 
     <FromPath>$(Bar)</FromPath> 
    </PropertyGroup> 
    <ItemGroup> 
     <AbsolutePaths Include="c:\temp\msbuild-sample\1\**\*.txt" /> 
    </ItemGroup> 
    <Target Name="Build"> 
     <ItemGroup> 
      <PathsRelativeToBar Include="@(AbsolutePaths)"> 
       <!-- Here is the magic... we're adding a piece of metadata with the relative path --> 
       <RelativePath>$([MSBuild]::MakeRelative($(FromPath), %(AbsolutePaths.FullPath)))</RelativePath> 
      </PathsRelativeToBar> 
     </ItemGroup> 
     <Message Text="----- Absolute paths -----" /> 
     <Message Text="%(AbsolutePaths.FullPath)" /> 
     <Message Text="----- Relative paths (showing full path) -----" /> 
     <Message Text="%(PathsRelativeToBar.FullPath)" /> 
     <Message Text="----- Relative paths (relative to $(FromPath)) -----" /> 
     <Message Text="%(PathsRelativeToBar.RelativePath)" /> 
    </Target> 
</Project> 

Вот быстрый взгляд на моей текущей среды

C:\temp\msbuild-sample>dir /s /b 

C:\temp\msbuild-sample\1 
C:\temp\msbuild-sample\sample.build 
C:\temp\msbuild-sample\1\1.1 
C:\temp\msbuild-sample\1\1.txt 
C:\temp\msbuild-sample\1\2.txt 
C:\temp\msbuild-sample\1\1.1\3.txt 
C:\temp\msbuild-sample\1\1.1\4.txt 

и вот выход.

----- Absolute paths ----- 
c:\temp\msbuild-sample\1\1.1\3.txt 
c:\temp\msbuild-sample\1\1.1\4.txt 
c:\temp\msbuild-sample\1\1.txt 
c:\temp\msbuild-sample\1\2.txt 
----- Relative paths (showing full path) ----- 
c:\temp\msbuild-sample\1\1.1\3.txt 
c:\temp\msbuild-sample\1\1.1\4.txt 
c:\temp\msbuild-sample\1\1.txt 
c:\temp\msbuild-sample\1\2.txt 
----- Relative paths (relative to c:\temp\msbuild-sample\2) ----- 
..\1\1.1\3.txt 
..\1\1.1\4.txt 
..\1\1.txt 
..\1\2.txt 

Надеется, что это помогает :)

+0

Удивительный, очень полезный ответ! Я никогда не знал об этой функции. –

Смежные вопросы