【问题标题】:Using MSBuild 4.0, is it possible to "simplify" a property containing a path?使用 MSBuild 4.0,是否可以“简化”包含路径的属性?
【发布时间】:2011-11-13 08:23:18
【问题描述】:

假设我有一个包含

的属性
c:\workdir\project\wonder\subproj\..\..\common

我想减少/简化它

c:\workdir\project\common

此外,我还希望能够从当前目录或指定的目录中获取相对路径。

使用相同的起始属性并将当前工作目录设置为

c:\workdir\project\wonder

我希望它减少到

..\common

【问题讨论】:

标签: path relative-path msbuild-4.0


【解决方案1】:

第一部分(解析路径中的'..')相对简单,只需使用property functions即可:

<PropertyGroup>
  <Folder>c:\workdir\project\wonder\subproj\..\..\common</Folder>
</PropertyGroup>
<Message Text="Folder $(Folder)" />     
<Message Text="Shortened path $([System.IO.Path]::GetFullPath($(Folder)))" />

输出:

Folder c:\workdir\project\wonder\subproj\..\..\common
Shortened path c:\workdir\project\common

第二部分 - 相对于另一个缩短一条路径 - 需要使用神奇的函数 Uri.MakeRelativeUri() 并将其包装在 inline task(或外部任务库)中。声明你的任务:

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

然后按如下方式使用:

<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)" />

输出:

Folder c:\workdir\project\wonder\subproj\..\..\common
Base directory c:\workdir\project\wonder
Relative path ..\common

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2014-09-11
    • 2021-10-15
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多