2010-01-22 67 views
9

请放心我是msbuild和msbuildtasks的新手!如何从其他带有相对文件路径的msbuild项目导入msbuildcommunitytasks项目?

我怎样才能设置一个属性,它表示一个相对文件路径到我想要导入的目标文件?我需要相对引用,所以它可以在所有开发机器上工作。但是导入的目标是试图在内部使用相对文件路径,这将不起作用,因为它是相对于导入目标重新评估的!

有效,我努力工作,引进项目的documented behaviour周围:

进口 项目中的所有相对路径相对被解释为 进口项目的目录。 因此,如果一个项目文件 导入到 不同位置的多个项目文件,在导入项目文件 相对 路径将受到不同的 每个引进项目的解释。

+0

有,为什么你不给的MSBuild%PROGDIR%\的MSBuild \ MSBuildCommunityTasks \把MSBuildCommunityTask LIB并排具体的原因是什么?然后,路径可能是相对的MSBuild(如由MSBCT人建议):<导入项目=“$(MSBuildExtensionsPath)\ MSBuildCommunityTasks \ MSBuild.Community.Tasks.Targets” /> – Filburt 2010-01-22 15:48:39

+2

是的,因为我将不得不在其上安装它所有开发/构建机器,然后必须管理升级它们。 – 2010-01-22 16:00:43

回答

5

好的,我找到了答案。基本上你必须将属性MSBuildCommunityTasksPath设置为相对路径,返回到原始包含目录。

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

Root---project---Build---{My msbuild project} 
      | 
      |-Tools---MSBuildCommunityTasks---{Binaries and Targets} 
其中:
{我的MSBuild项目}是根\工程\建设\
{MSbuildCommunityTasks}是根\项目\工具\ MsBuildCommunityTasks

要获得目标项目通过属性MSBuildCommunityTasksPath引用它的二进制文件,它会发现任务文件是这样的:

<PropertyGroup> 
    <MSBuildCommunityTasksPath>..\MSBuildCommunityTasks\</MSBuildCommunityTasksPath> <!--Relative path back to yourself--> 
</PropertyGroup> 

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

<Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/> 
15

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> 
+0

但这些绝对文件路径不是?还是我误解?我需要使用相对文件路径来引用它,或者至少能够在运行时转换相对文件路径。 – 2010-01-22 16:18:42

+0

大多数工具需要完整的路径才能正常工作。我在.proj文件中创建了一些.proj文件中的一些变量,这些变量都包含在我的'working'.proj文件中。这些变量包含各种事物的固定路径部分。 在属性组中:$(WorkingDrive)$(SolutionFolder)\ $(Branch)\ NET \ BuildOut $(Configuration) $(SolutionFolder)是从其他东西构建的, -Minor内部编号等(具体到我们的设置) 然后其他.proj文件导入它: DaveE 2010-01-22 17:07:35

+3

您应该能够从相对路径构建完整路径。你可以使用像MSBuildProjectDirectory这样的属性。 – 2010-01-22 19:15:37

6

@Sayed易卜拉欣哈希米

在说什么MSBuild4 刚刚宣布MSBuildCommunityTasksLib不会引起足够如果u检查的MSBuild .Community.Tasks.Targets文件的属性声明如下

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

因此,如果U只能在MSBuildCommunityTasksLib中运行,它将再次在MSBuild.Community.Tasks.Targets文件中重演,因为它不是有条件的 所以你还必须覆盖MSBuildCommunityTasksPath,以便它的proerty不是来自MSBuildExtensionsPath而是来自ur自定义路径。 Correst me如果我错了

0

如果我很诚实,我是msbuild的noob,但是我刚刚解决了我自己的问题。我将其中一个目标转化为自己的项目,并没有找到msbuild社区路径的路径。如果你看一下你原来的项目你会发现这样的事情

<PropertyGroup> 
    <ExtensionTasksPath>./</ExtensionTasksPath> 
    <MSBuildCommunityTasksPath>./</MSBuildCommunityTasksPath> 
</PropertyGroup> 

<Import Project="MSBuildExtensionPack\MSBuild.ExtensionPack.tasks"/> 
<Import Project="MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

拷贝代码到你的新项目,它应该工作。

+0

这是行不通的。你的变量甚至没有使用$()转义。示例: Alkaline 2012-12-19 04:15:30

0

我只是想补充一点,因为我不能评论(REP),即做一个路径,您的特定项目,你可以在你的属性组使用$(SolutionDir)像这样:

$(SolutionDir)\我的代码\社区\的MSBuild \ CommunityTasks \

这样,它不是束缚于一个特定的驱动器,可以根据断相对于您的解决方案目录结构中的项目的位置。

也感谢您的回答上面它帮助我在我的上面加项目。

相关问题