请放轻松我是msbuild和msbuildtasks的新手!
如何设置一个属性,该属性表示我要导入的目标文件的相对文件路径?我需要相对引用,因此它可以在所有开发机器上运行。但导入的目标是尝试在内部使用相对文件路径,因为它相对于导入的目标进行了重新评估,因此无法正常工作!
实际上,我正在尝试解决导入项目的documented behaviour:
导入的所有相对路径 项目是相对于解释的 导入项目的目录。 因此,如果是项目文件 导入到几个项目文件中 不同的地方,相对 导入的项目文件中的路径 将以不同的方式解释 每个进口项目。
答案 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}其中:
要使目标项目通过属性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 \
这种方式不依赖于特定的驱动器,可以基于项目相对于解决方案目录结构的位置。
还要感谢上面的答案,它帮助我完成了上面添加的项目。