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

如何从另一个具有相对文件路径的msbuild项目导入msbuildcommunitytasks项目?,msbuild,msbuildcommunitytasks,Msbuild,Msbuildcommunitytasks,请放心,我是msbuild和msbuild任务的新手 如何设置表示要导入的目标文件的相对文件路径的属性?我需要相对的参考,所以它将在所有的开发机器上工作。但是要导入的目标正在尝试在内部使用相对文件路径,这将不起作用,因为它是相对于导入的目标重新计算的 实际上,我正在努力解决导入项目的问题: 导入中的所有相对路径 项目是相对于 导入项目的目录。 因此,如果项目文件是 导入到中的多个项目文件中 不同的位置,相对的 导入的项目文件中的路径 将以不同的方式进行解释 每个导入的项目 当时也有类似的问题。这

请放心,我是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的回答。这无法工作。您的变量甚至没有使用$()进行转义。示例: