【问题标题】:How can I get the path of the current msbuild file?如何获取当前 msbuild 文件的路径?
【发布时间】:2010-03-10 17:04:37
【问题描述】:

我正在编写一个 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)'" />

【问题讨论】:

    标签: msbuild


    【解决方案1】:

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

    例如

    Sample.targets

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

    Build.proj

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

    在相关说明中,我曾在 Elements of Reusable MSBuild Scripts: Validation 的博客上讨论过验证此类“共享”属性。

    MSBuild v. 4.0 及更高版本

    如果您使用的是 MSBuild 4.0(或更高版本),即 Visual Studio 2010/.NET 4.0(可以针对 .NET 2.0/3.0/3.5)。那么你现在有these properties 可以用于这个特定目的:

    • MSBuildThisFile
    • MSBuildThisFileDirectory
    • MSBuildThisFileDirectoryNoRoot

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多