MSBuild共享的.targets文件

MSBuild共享的.targets文件,msbuild,Msbuild,我有几个.csproj文件,我将把一个公共的.targets文件导入其中,以扩展构建过程。这些项目位于不同的目录中。.targets文件位于解决方案目录中。如何引用.targets文件的位置以导入它?有一个解决方案目录属性,但是如果开发人员只是构建一个项目,那么它就不起作用。我该怎么办?我使用的是.NET 4.5和Visual Studio 2015。因为您认为一个项目不知道它所包含的解决方案,而且可以说它不应该知道。因此,从项目的角度来看,要以编程方式找出一个完全不相关的文件位于何处,您可以做

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

因为您认为一个项目不知道它所包含的解决方案,而且可以说它不应该知道。因此,从项目的角度来看,要以编程方式找出一个完全不相关的文件位于何处,您可以做的不多。除了扫描整个文件系统之外。有一些替代方案:

  • 依赖于适当的目录结构。您已经这样做了,因为您使用的解决方案还需要在固定位置查找项目。因此,假设您有一个带有projectA/a.vcxproj、projectB/b.vcxproj和solutionDir/ab.sln以及solutionDir/my.targets的主项目目录,然后在a和b中只
  • 需要设置为目标文件位置的属性(或环境变量),然后使用
  • 将目标文件放在“已知”msbuild位置,如Importbefore/ImportAfter目录,例如前面提到的

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

我在一个大型项目中工作,所以我无法控制目录结构。不幸的是,我不会为我工作。所有文件都签入源代码管理,开发人员可以将文件放在他们喜欢的驱动器上的任何位置,因此3也不起作用。我会等着看是否有更多的答案出现,因为我来这里是为了避免2,但这可能是我的方向。我遗漏了一些东西,为什么1不起作用?您可以在解决方案目录中指定目标文件。解决方案使用相对路径来查找项目,因此项目具有到解决方案的固定相对路径,因此目标文件也是如此。您是否有不属于解决方案的项目?项目在目录结构中处于不同的级别。有些有两层,有些有三层。。。我想我可以在.sln文件上设置一些条件来确定我所处的深度。