2016-08-16 82 views
1

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

回答

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服务器上也可以很好地工作。第二种选择也是可行的,但它依赖于一个适当的设置环境,它不太“自包含”,如果开发人员开始在机器的全局环境变量设置和本地环境变量设置中输入变量,则会变得非常混乱上。第三个类似的问题,但现在只有一个正确的位置更糟。

+0

我正在一个大型项目中工作,所以我无法控制目录结构。不幸的是1不会为我工作。所有这些文件都被检入到源代码控制中,并且开发人员可以将文件放在他们喜欢的驱动器上的任何位置,所以3也不起作用。我会等着看是否有更多的答案进来,因为我来这里试图避免2,但这可能是我走的方向。 –

+0

我错过了什么,为什么不工作?您将目标文件放在解决方案目录中。该解决方案使用相对路径来查找项目,以便项目具有到解决方案的固定相对路径,因此也具有目标文件。你有不是解决方案的一部分的项目吗? – stijn

+0

项目在目录结构中处于不同的级别。有些是两层深的,有三层......我想我可以在.sln文件上做现有条件来确定我在哪个深度。 –