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

时间:2010-01-22 15:04:11

标签: msbuild msbuildcommunitytasks

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

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

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

  

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

6 个答案:

答案 0 :(得分:15)

Is it possible to use MSBuild Extension Pack without installation?有一个类似的问题。那个问题是如何对MSBuild Extension Pack做同样的事情,这两者在这方面都是相似的。对于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>

答案 1 :(得分:6)

@Sayed Ibrahim Hashimi

谈论MSBuild4 如果您检查MSBuild.Community.Tasks.Targets文件,则声明MSBuildCommunityTasksLib不足以导致属性声明如下

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

因此,如果U只能越过MSBuildCommunityTasksLib,它将再次在MSBuild.Community.Tasks.Targets文件中越过,因为它不是有条件的 因此,你必须覆盖MSBuildCommunityTasksPath,以便它的属性不是从MSBuildExtensionsPath设置的,而是来自你的自定义路径。 如果我错了,请把我弄清楚

答案 2 :(得分:5)

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

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

Root---project---Build---{My msbuild project}
           |
           |-Tools---MSBuildCommunityTasks---{Binaries and Targets}
其中:
{My msbuild project}位于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 :(得分:0)

这似乎是一个答案:

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

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

答案 4 :(得分:0)

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

<PropertyGroup>
    <ExtensionTasksPath>./</ExtensionTasksPath>
    <MSBuildCommunityTasksPath>./</MSBuildCommunityTasksPath>
</PropertyGroup>

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

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

答案 5 :(得分:0)

我只是想添加,因为我无法评论(rep),要做一个特定项目的路径,你可以在你的属性组上使用$(SolutionDir),如下所示:

$(SolutionDir)\我的代码\社区\ MSBuild \ CommunityTasks \

这种方式不依赖于特定的驱动器,可以基于项目相对于解决方案目录结构的位置。

还要感谢上面的答案,它帮助我完成了上面添加的项目。