MSBuild共享.targets文件

时间:2016-08-16 21:41:45

标签: msbuild

我有几个.csproj文件,我将导入一个常见的.targets文件,以扩展构建过程。这些项目位于不同的目录中。 .targets文件位于解决方案目录中。如何引用.targets文件的位置来导入它?有一个解决方案目录属性,但如果开发人员只是构建一个项目,这不起作用。我该怎么办?我使用的是.NET 4.5和Visual Studio 2015。

1 个答案:

答案 0 :(得分:2)

正如你所知,一个项目不知道它所包含的解决方案,并且可以说它不应该。因此,从项目的角度来看,你可以通过编程方式找出一个完全不相关的文件所在的位置。除了扫描整个文件系统。有一些替代方案:

  • 依赖于正确的目录结构。无论如何,您已经这样做了,因为您使用的解决方案还需要在固定位置查找项目。假设您有一个主项目目录,其中包含projectA / a.vcxproj,projectB / b.vcxproj和solutionDir / ab.sln以及solutionDir / my.targets,然后在a和b中<Import Project="$(MSBuildProjectDirectory)..\solutionDir\my.targets"/>
  • 需要一个属性(或环境变量),该属性设置为目标文件的位置,然后使用<Import Project="$(SomeDir)\my.targets"/>
  • 将您的目标文件放在“已知”的msbuild位置,例如Importbefore / ImportAfter目录,例如提到here

我已经在一个点上使用了所有这些,最后在我看来第一个是更好的一个:你只需坚持一个目录约定 - 你需要无论如何项目跨越多个目录或与共同的共享东西 - 就是这样。例如,我们有大量常见的msbuild文件,它们位于单个存储库中。开始一个新项目总是归结为创建目录,克隆公共文件目录和添加新项目目录。这可以很容易地实现自动化,也适用于典型的CI服务器。第二个选项也是可行的,但它依赖于一个正确的设置环境,如果开发人员开始在机器的全局环境变量设置和本地环境中输入变量,那么它就不那么“自包含”并且变得非常混乱,所以上。与第三个类似的问题,但更糟,因为现在只有一个正确的位置。