2011-09-08 11 views
2

私はMSBuild 4.0を使用すると、パスを含むプロパティを「単純化」できますか?

c:\workdir\project\wonder\subproj\..\..\common 

を含むプロパティを持っていると私は

さらに
c:\workdir\project\common 

にそれを簡素化/削減したいと、私はまた、からの相対パスを取得できるようにしたいと思います現在のディレクトリまたは指定されたディレクトリ。

同じ起動プロパティを使用して

c:\workdir\project\wonder 

に設定された現在の作業ディレクトリを持つ私はそれが

..\common 
+0

カスタム 'UsingTask'スクリプトでこれを行うことができます。http:// MSDNを以下のように

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

そして、それを使用しています。 microsoft.com/en-us/library/t41tzex2.aspxと少しのC#。 – skolima

答えて

4

(パスに解決「...」)最初の部分にまで低減したいです比較的簡単ですが、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(または外部タスク・ライブラリー)の内部にそれを包みます。あなたのタスクを宣言します。

<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 
関連する問題