代码之家  ›  专栏  ›  技术社区  ›  Scott Langham

如何获取当前msbuild文件的路径?

  •  27
  • Scott Langham  · 技术社区  · 16 年前

    我正在编写一个msbuild.targets文件,在该文件中,我想使用zip任务压缩一些我知道相对于.targets文件位置的文件。

    当我直接执行.target文件时,这可以正常工作。但是,当我将.targets文件包含在另一个目录中的.proj文件中时,相对路径是相对于.proj文件而不是相对于.targets文件解析的。

    有没有一种方法可以指定与我写入的文件相关的相对路径?


    我见过这样的问题:

    How to give relative path in msbuild file?


    我想到的一个解决办法是做以下事情。我还没试过呢。行吗,有更好的办法吗?

    PROJ

    <Import Project="..\Somewhere\my.targets"/>
    <PropertyGroup>
       <MyTargetsYouAreHere>$(MSBuildProjectDirectory)\..\Somewhere</MyTargetsYouAreHere>
    </PropertyGroup>
    

    我的目标

    <Message Text="my.targets is here '$(MyTargetsYouAreHere)'" />
    
    1 回复  |  直到 8 年前
        1
  •  60
  •   Grzegorz Smulko    8 年前

    处理文件时,msbuild的工作方式是读取所有文件,并为所有这些文件创建一个内存表示。这一切都发生在执行任何目标之前。因此,当目标执行时,它不知道它包含在哪个文件中。基本上,您将无法使用.targets文件中的相对路径。处理这种情况的方法是确保您的外围.proj文件( 或者你用的任何分机 )声明.targets文件用于解析共享文件完整路径的已知属性。

    例如

    样本.目标

    <Project ...>
        <Target Name="ExecTool">
            <Exec Command="$(YourToolPath)tool.exe" />
        </Target>
    
    </Project>
    

    PROJ

    <Project ...>
        <PropertyGroup>
            <YourToolPath>$(MSBuildProjectDirectory)\..\</YourToolPath>
        </PropertyGroup>
    
        <Import Project="..\..\..\Sample.targets"/>
    </Project>
    

    在一个相关的注释中,我讨论了在我的博客上验证这些“共享”属性 Elements of Reusable MSBuild Scripts: Validation .

    msbuild v.4.0及以上版本

    如果你正在使用 MSBug 4 (或更高版本),即visual studio 2010/.net 4.0(也可以针对.net 2.0/3.0/3.5)。你现在有了 these properties 可用于此特定目的:

    • MSBuildThisFile
    • MSBuildThisFileDirectory
    • MSBuildThisFileDirectoryNoRoot