代码之家  ›  专栏  ›  技术社区  ›  Noel Kennedy

如何从具有相对文件路径的另一个MSBuild项目导入MSBuildCommunityTasks项目?

  •  9
  • Noel Kennedy  · 技术社区  · 15 年前

    请轻点,我是新来的msbuild和msbuild任务!

    如何设置表示要导入的目标文件的相对文件路径的属性?我需要相对的引用,这样它就可以在所有开发机器上工作。但是导入的目标正在尝试在内部使用相对文件路径,因为相对于导入的目标重新评估该路径,因此无法工作!

    实际上,我正在努力解决 documented behaviour 进口项目数量:

    导入的所有相对路径 项目是相对于 导入项目的目录。 因此,如果项目文件是 导入到多个项目文件中 不同的地点,相对 导入的项目文件中的路径 将以不同的方式解释 每个导入的项目。

    6 回复  |  直到 10 年前
        1
  •  15
  •   Community Mr_and_Mrs_D    7 年前

    有一个相似的问题 Is it possible to use MSBuild Extension Pack without installation? . 问题是如何对 MSBuild Extension Pack 两者在这方面是相似的。对于扩展包,您必须声明该属性 扩展任务库 ,对于社区任务,必须声明一个名为 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>
    
        2
  •  6
  •   Vipresh    13 年前

    @易卜拉欣·哈希米说

    谈论msbuild4 仅仅声明msbuildCommunityTaskslib是不够的,因为如果检查msbuild.community.tasks.targets文件,属性声明如下

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

    因此,如果您只在msbuild.community.tasks.slib之上,它将再次在msbuild.community.tasks.targets文件中被覆盖,因为它不是有条件的 因此,您还必须重写msbuildCommunityTasksPath,以便其属性不是从msbuildExtensionsPath设置的,而是从您的自定义路径设置的。 如果我错了,请告诉我。

        3
  •  5
  •   Noel Kennedy    14 年前

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

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

    Root---project---Build---{My msbuild project}
               |
               |-Tools---MSBuildCommunityTasks---{Binaries and Targets}
    
    在哪里?
    我的msbuild项目位于根\项目\生成中\
    msbuildCommunityTasks位于根目录\项目\工具\ msbuildCommunityTasks中

    要使目标项目通过属性msbuildCommunityTasksPath引用其二进制文件,它将找到如下任务文件:

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

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

      <Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/>
    
        4
  •  0
  •   Noel Kennedy    15 年前

    这似乎是一个答案:

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

    但这(如果我理解正确的话)似乎是一个荒谬的解决方案。为了获得工作的途径,我需要改变 进口的 项目参考?如果我想引用另一个文件夹中从第三个项目导入的项目,会发生什么?!?

        5
  •  0
  •   Jason Sturges    12 年前

    如果我很诚实的话,我是一个在msbuild的笨蛋,但是我刚刚解决了我自己的问题。我将其中一个目标转化为自己的项目,但它没有找到msbuild社区路径的路径。如果你看你原来的项目,你可能会发现这样的东西

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

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

        6
  •  0
  •   Mark Tomlinson    10 年前

    我只是想补充一点,因为我不能评论(rep),要为您的特定项目做一个路径,您可以在您的属性组上使用$(solutiondir),如下所示:

    $解决方案目录\我的代码\社区\msbuild \社区任务\

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

    同样感谢上面的答案,它帮助我在我的项目中添加了上面的内容。