请放轻松我是 msbuild 和 msbuildtasks 的新手!
如何设置表示要导入的目标文件的相对文件路径的属性?我需要相对引用,以便它适用于所有开发机器。但是导入的目标试图在内部使用相对文件路径,这将不起作用,因为它是相对于导入的目标重新评估的!
实际上,我正在尝试解决导入项目的记录行为:
导入项目中的所有相对路径都相对于导入项目的目录进行解释。因此,如果将一个项目文件导入到不同位置的多个项目文件中,则导入的项目文件中的相对路径将针对每个导入的项目进行不同的解释。
请放轻松我是 msbuild 和 msbuildtasks 的新手!
如何设置表示要导入的目标文件的相对文件路径的属性?我需要相对引用,以便它适用于所有开发机器。但是导入的目标试图在内部使用相对文件路径,这将不起作用,因为它是相对于导入的目标重新评估的!
实际上,我正在尝试解决导入项目的记录行为:
导入项目中的所有相对路径都相对于导入项目的目录进行解释。因此,如果将一个项目文件导入到不同位置的多个项目文件中,则导入的项目文件中的相对路径将针对每个导入的项目进行不同的解释。
在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>
好的,我找到了答案。本质上,您必须将属性 MSBuildCommunityTasksPath 设置为返回到原始包含目录的相对路径。
例如,给定这样的文件夹结构:
根---项目---构建---{我的 msbuild 项目} | |-Tools---MSBuildCommunityTasks---{二进制文件和目标}其中:
要让目标项目通过属性 MSBuildCommunityTasksPath 引用其二进制文件,它将找到如下任务文件:
<PropertyGroup>
<MSBuildCommunityTasksPath>..\MSBuildCommunityTasks\</MSBuildCommunityTasksPath> <!--Relative path back to yourself-->
</PropertyGroup>
然后您可以使用另一个相对文件引用导入目标文件:
<Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/>
@Sayed Ibrahim Hashimi
谈论 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 设置,而是从您的自定义路径设置. 如果我错了,请纠正我
这似乎是一个答案:
http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/feb782e3-72ae-4476-9011-617796f217b6
但这(如果我理解正确的话)似乎是一个荒谬的解决方案。要获得工作路径,我需要更改导入的项目引用?如果我想从另一个文件夹中的第三个项目中引用导入的项目会发生什么?!?
如果我很诚实的话,我是 msbuild 的菜鸟,但是我刚刚解决了我自己遇到的问题。我正在将其中一个目标变成它自己的项目,但它没有找到 msbuild 社区路径的路径。如果您查看原始项目,您可能会发现类似这样的内容
<PropertyGroup>
<ExtensionTasksPath>./</ExtensionTasksPath>
<MSBuildCommunityTasksPath>./</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project="MSBuildExtensionPack\MSBuild.ExtensionPack.tasks"/>
<Import Project="MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
将此代码复制到您的新项目中,它应该可以工作。
我只是想补充一点,因为我无法评论(rep),要为您的特定项目创建路径,您可以在您的属性组上使用 $(SolutionDir),如下所示:
$(SolutionDir)\我的代码\社区\MSBuild\CommunityTasks\
这样它就不会绑定到特定的驱动器,并且可以基于项目相对于您的解决方案目录结构的位置。
还要感谢上面的答案,它在我的项目中通过上面的添加帮助了我。