如何从另一个具有相对文件路径的msbuild项目导入msbuildcommunitytasks项目?
请放心,我是msbuild和msbuild任务的新手 如何设置表示要导入的目标文件的相对文件路径的属性?我需要相对的参考,所以它将在所有的开发机器上工作。但是要导入的目标正在尝试在内部使用相对文件路径,这将不起作用,因为它是相对于导入的目标重新计算的 实际上,我正在努力解决导入项目的问题: 导入中的所有相对路径 项目是相对于 导入项目的目录。 因此,如果项目文件是 导入到中的多个项目文件中 不同的位置,相对的 导入的项目文件中的路径 将以不同的方式进行解释 每个导入的项目如何从另一个具有相对文件路径的msbuild项目导入msbuildcommunitytasks项目?,msbuild,msbuildcommunitytasks,Msbuild,Msbuildcommunitytasks,请放心,我是msbuild和msbuild任务的新手 如何设置表示要导入的目标文件的相对文件路径的属性?我需要相对的参考,所以它将在所有的开发机器上工作。但是要导入的目标正在尝试在内部使用相对文件路径,这将不起作用,因为它是相对于导入的目标重新计算的 实际上,我正在努力解决导入项目的问题: 导入中的所有相对路径 项目是相对于 导入项目的目录。 因此,如果项目文件是 导入到中的多个项目文件中 不同的位置,相对的 导入的项目文件中的路径 将以不同的方式进行解释 每个导入的项目 当时也有类似的问题。这
当时也有类似的问题。这个问题是如何对这两个在这方面相似的对象进行相同的操作。对于扩展包,必须声明属性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>
E:\Data\Development\My Code\Community\MSBuild\CommunityTasks\
这似乎是一个答案:
但这(如果我理解正确的话)似乎是一个荒谬的解决方案。要获得工作路径,我需要更改导入的项目引用?如果我想在另一个文件夹中引用从第三个项目导入的项目,会发生什么 好的,我找到答案了。实际上,您必须将属性MSBuildCommunityTasksPath设置为返回原始包含目录的相对路径。
例如,给定如下文件夹结构: Root---project---Build---{My msbuild project} | |-Tools---MSBuildCommunityTasks---{Binaries and Targets} 根目录---项目---生成---{My msbuild project} | |-工具---MSBuildCommunityTasks---{二进制文件和目标} 其中:
{My msbuild project}位于Root\project\Build\
{MSbuildCommunityTasks}位于根目录\Project\Tools\MSbuildCommunityTasks中
要使目标项目通过属性MSBuildCommunityTasksPath引用其二进制文件,它将找到如下任务文件: Root---project---Build---{My msbuild project} | |-Tools---MSBuildCommunityTasks---{Binaries and Targets}
..\MSBuildCommunityTasks\
然后,可以使用另一个相对文件引用导入目标文件:
<PropertyGroup>
<MSBuildCommunityTasksPath>..\MSBuildCommunityTasks\</MSBuildCommunityTasksPath> <!--Relative path back to yourself-->
</PropertyGroup>
@Sayed Ibrahim Hashimi
谈论MSBuild4
仅声明MSBuildCommunityTasksLib是不够的,因为如果检查MSBuild.Community.Tasks.Targets文件,属性声明如下
<Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/>
$(MSBuildExtensionsPath)\MSBuildCommunityTasks
$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll
因此,如果您只覆盖了MSBuildCommunityTasksLib,它将在MSBuild.Community.Tasks.Targets文件中再次被覆盖,因为它不是有条件的
因此,您还必须重写MSBuildCommunityTasksPath,以便其属性不是从MSBuildExtensionsPath设置的,而是从您的自定义路径设置的。
如果我错了请告诉我如果我很诚实的话,我是msbuild的noob,但是我刚刚解决了我自己的问题。我将其中一个目标转换为它自己的项目,但它没有找到msbuild社区路径的路径。如果你看看你原来的项目,你可能会发现像这样的东西
<PropertyGroup>
<MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
<MSBuildCommunityTasksLib>$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll</MSBuildCommunityTasksLib>
</PropertyGroup>
./
./
将此代码复制到您的新项目中,它应该可以工作。我只是想添加,因为我无法注释(rep),要创建特定项目的路径,您可以在属性组上使用$(SolutionDir),如下所示: $(SolutionDir)\My Code\Community\MSBuild\CommunityTasks\ 这样,它就不会绑定到特定的驱动器,并且可以基于项目相对于解决方案目录结构的位置
还感谢上面的回答,它通过上面的添加帮助了我在项目中的工作。有没有具体原因让您不将MSBuildCommunityTask库与MSBuild并排放置到%PROGDIR%\MSBuild\MSBuildCommunityTasks\?然后该路径可以是相对于MSBuild的(如MSBCT人员建议的):是的,因为我必须在所有开发/构建计算机上安装它,然后必须管理升级它们。但这些是绝对文件路径否?还是我误解了?我需要使用相对文件路径引用它,或者至少能够在运行时转换相对文件路径。大多数工具都需要完整路径才能正常工作。我在一个.proj中设置了几个变量,这些变量包含在我所有的“working.proj”文件中。这些变量包含各种事物路径的固定部分。在属性组中:$(WorkingDrive)$(SolutionFolder)\$(Branch)\NET\BuildOut$(Configuration)$(SolutionFolder)是从其他内容生成的,例如主-次生成编号等(特定于我们的设置),然后其他.proj文件将其导入:您应该能够从相对路径生成完整路径。您可以使用诸如MSBuildProjectDirectory之类的属性。“声明MSBuildCommunityTasksLib可能不够,请参阅@Vipresh的回答。这无法工作。您的变量甚至没有使用$()进行转义。示例: