【问题标题】:How do I import the msbuildcommunitytasks project from another msbuild project with a relative file path?如何从具有相对文件路径的另一个 msbuild 项目导入 msbuildcommunitytasks 项目?
【发布时间】:2010-01-22 15:04:10
【问题描述】:

请放轻松,我是 msbuild 和 msbuildtasks 的新手!

如何设置一个属性,该属性表示我要导入的目标文件的相对文件路径?我需要相对引用,以便它适用于所有开发机器。但是导入的目标试图在内部使用相对文件路径,这将不起作用,因为它是相对于导入的目标重新评估的!

实际上我正在尝试解决导入项目的documented behaviour

导入的所有相对路径 项目被解释为相对于 导入项目的目录。 因此,如果一个项目文件是 导入到几个项目文件中 不同地点,相对 导入项目文件中的路径 会有不同的解释 每个导入的项目。

【问题讨论】:

  • 您不将 MSBuildCommunityTask 库与 MSBuild 并排放置到 %PROGDIR%\MSBuild\MSBuildCommunityTasks\ 是否有特定原因?然后路径可能与 MSBuild 相关(如 MSBCT 人员建议的那样):
  • 是的,因为我必须在所有开发/构建机器上安装它,然后必须管理升级它们。

标签: msbuild msbuildcommunitytasks


【解决方案1】:

Is it possible to use MSBuild Extension Pack without installation? 也有类似的问题。那个问题是如何对MSBuild Extension Pack 做同样的事情,两者在这方面是相似的。对于扩展包,您必须声明属性 ExtensionTasksPath,对于社区任务,您必须声明一个名为 MSBuildCommunityTasksLib 的类似属性。因此,在您的情况下,它应该如下所示:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <MSBuildCommunityTasksLib Condition="'$(MSBuildCommunityTasksLib)' == ''">E:\Data\Development\My Code\Community\MSBuild\CommunityTasks\</MSBuildCommunityTasksLib>
  </PropertyGroup>

  <Import Project="$(MSBuildCommunityTasksLib)MSBuild.Community.Tasks.Targets"/>

  <Target Name="Demo">
    <!-- Use the tasks here -->
  </Target>

</Project>

【讨论】:

  • 但是这些是绝对文件路径不是吗?还是我误会了?我需要使用相对文件路径来引用它,或者至少能够在运行时转换相对文件路径。
  • 大多数工具需要完整路径才能正常工作。我在 .proj 中设置了几个变量,这些变量包含在我所有的“工作”.proj 文件中。这些变量包含各种事物的路径的固定部分。在属性组中: $(WorkingDrive)$(SolutionFolder)\$(Branch)\NET\BuildOut$(Configuration) $(SolutionFolder) 是从其他东西构建的,例如主要-次要内部版本号等(特定于我们的设置)然后其他 .proj 文件导入它:
  • 您应该能够从相对路径构建完整路径。您可以使用 MSBuildProjectDirectory 等属性。
  • "
    声明 MSBuildCommunityTasksLib 可能还不够,请参阅@Vipresh 的回答
【解决方案2】:

好的,我找到了答案。本质上,您必须将属性 MSBuildCommunityTasksPath 设置为返回到原始包含目录的相对路径。

例如,给定这样的文件夹结构:

Root---project---Build---{我的msbuild项目}
           |
           |-Tools---MSBuildCommunityTasks---{二进制文件和目标}
地点:
{我的 msbuild 项目} 位于 Root\Project\Build\
{MSbuildCommunityTasks} 位于 Root\Project\Tools\MsBuildCommunityTasks

要让目标项目通过属性 MSBuildCommunityTasksPath 引用其二进制文件,它会找到如下所示的任务文件:

<PropertyGroup>
    <MSBuildCommunityTasksPath>..\MSBuildCommunityTasks\</MSBuildCommunityTasksPath> <!--Relative path back to yourself-->
</PropertyGroup>

然后您可以使用另一个相关文件引用导入目标文件:

  <Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/>

【讨论】:

    【解决方案3】:

    @赛义德·易卜拉欣·哈希米

    谈MSBuild4 如果您检查 MSBuild.Community.Tasks.Targets 文件,仅声明 MSBuildCommunityTasksLib 就不够了,属性声明如下

    <PropertyGroup>
        <MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
        <MSBuildCommunityTasksLib>$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll</MSBuildCommunityTasksLib>
      </PropertyGroup>
    

    因此,如果您仅覆盖 MSBuildCommunityTasksLib,它将再次在 MSBuild.Community.Tasks.Targets 文件中被覆盖,因为它不是有条件的 因此,您还必须覆盖 MSBuildCommunityTasksPath,以便它的属性不是从 MSBuildExtensionsPath 设置的,而是从您的自定义路径设置的。 如果我错了,请纠正我

    【讨论】:

      【解决方案4】:

      这似乎是一个答案:

      http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/feb782e3-72ae-4476-9011-617796f217b6

      但这(如果我理解正确的话)似乎是一个荒谬的解决方案。要获得工作路径,我需要更改 imported 项目引用?如果我想从另一个文件夹中的第三个项目中引用导入的项目会怎样?!?

      【讨论】:

        【解决方案5】:

        如果我很诚实的话,我是 msbuild 的菜鸟,但是我刚刚解决了我自己遇到的问题。我正在将其中一个目标变成它自己的项目,但它没有找到 msbuild 社区路径的路径。如果您查看您的原始项目,您可能会发现类似这样的内容

        <PropertyGroup>
            <ExtensionTasksPath>./</ExtensionTasksPath>
            <MSBuildCommunityTasksPath>./</MSBuildCommunityTasksPath>
        </PropertyGroup>
        
        <Import Project="MSBuildExtensionPack\MSBuild.ExtensionPack.tasks"/>
        <Import Project="MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
        

        将此代码复制到您的新项目中,它应该可以工作。

        【讨论】:

        • 这行不通。您的变量甚至没有使用 $() 进行转义。示例:
        【解决方案6】:

        我只是想补充一点,因为我无法评论 (rep),所以要为您的特定项目创建路径,您可以像这样在您的属性组上使用 $(SolutionDir):

        $(SolutionDir)\My Code\Community\MSBuild\CommunityTasks\

        这样它就不会绑定到特定的驱动器,并且可以基于项目相对于您的解决方案目录结构的位置。

        也感谢上面的回答,它在我的项目中帮助了我上面的添加。

        【讨论】:

          猜你喜欢
          • 2020-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-16
          • 1970-01-01
          • 2022-08-15
          • 1970-01-01
          相关资源
          最近更新 更多