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

Noe*_*edy 9 msbuild msbuildcommunitytasks

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

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

实际上,我正在尝试解决导入项目的记录行为:

导入项目中的所有相对路径都相对于导入项目的目录进行解释.因此,如果将项目文件导入到不同位置的多个项目文件中,则导入的项目文件中的相对路径将针对每个导入的项目进行不同的解释.

Say*_*imi 15

有一个类似的问题是否可以在没有安装的情况下使用MSBuild Extension Pack?.那个问题是如何对MSBuild扩展包做同样的事情,这两者在这方面都是相似的.对于Extension Pack,您必须声明属性ExtensionTasksPath,对于Community任务,您必须声明一个名为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>
Run Code Online (Sandbox Code Playgroud)

  • 您应该能够从相对路径构建完整路径.您可以使用MSBuildProjectDirectory等属性. (3认同)

Vip*_*esh 6

@Sayed Ibrahim Hashimi

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

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

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


Noe*_*edy 5

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

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

Root ---项目---构建--- {我的msbuild项目}
           |
           | -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>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用另一个相对文件引用导入目标文件:

  <Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/>
Run Code Online (Sandbox Code Playgroud)