MSBuild + Visual Studio:为解决方案中的所有项目自定义默认“复制本地”

Posted

技术标签:

【中文标题】MSBuild + Visual Studio:为解决方案中的所有项目自定义默认“复制本地”【英文标题】:MSBuild + Visual studio: Customize default "Copy Local" for all projects in the solution 【发布时间】:2011-09-09 01:46:03 【问题描述】:

我对 MSBuild 知之甚少。

最近我读到将大型解决方案的“本地复制”设置为 false 可以显着减少编译时间。 我找到了一种将默认设置设置为 false 的方法,方法是在 MSBuild 扩展路径中设置一个名为 CustomAfterMicrosoftCommon.targets 的机器范围文件。

这种方法效果很好,但是这种方法存在一些问题。

-此默认值设置是系统范围的,我希望它仅适用于特定解决方案。我不在项目级别这样做,因为我在几个不同的解决方案中有很多。

-我希望将此默认值应用于“非输出项目”。我的意思是类库项目不应该将本地复制设置为true。但是,主应用程序项目需要将类库依赖项复制为 true,因为它需要运行。 理想情况下,对于那些输出项目,我想回退到更智能的开箱即用默认值,该默认值足够聪明,可以确定引用是否应该是私有的。我想我可以将默认的 Copy Local 设为 false,然后在需要的地方明确地将 Copy Local 设置为 true。鉴于您通常没有很多输出项目,这还不错,但我想看看是否有人提出了更好的解决方案。

有什么想法吗?

【问题讨论】:

您能否使用 CustomAfterMicrosoftCommon 文件更详细地解释您的解决方案? 【参考方案1】:

Msbuild 像这样找到目标扩展 %MSBuildExtensionsPath%\v4.0\CustomAfterMicrosoftCommon.targets

因此,解决您的第一个问题的一种方法是以某种方式仅将 MSBuildExtensionsPath 设置为您想要应用自己的默认值的解决方案。

我用另一种方式解决了第二个问题。我还在“主应用程序项目”中保留了copylocal=false。相反,我将另一个项目的输出路径添加到 DEVPATH 环境变量中。

SET DEVPATH=C:\Proj1\Output;C:\Proj2\Output

(并按照here 的规定对 machine.config 进行必要的更改)

编辑:

Here is nice page about how to make settings with project or solution scope

【讨论】:

您能否更详细地解释您如何仅为解决方案设置 MSBuildExtensionsPath ?那是环境变量吗?如果我打开命令提示符并键入 echo %MSBuildExtensionsPath%,看起来这个变量甚至没有定义。 它是一个环境变量。如果未定义,msbuild 将在默认文件夹中查找。 (类似于 c:\Program Files\MSBuild\v4)

以上是关于MSBuild + Visual Studio:为解决方案中的所有项目自定义默认“复制本地”的主要内容,如果未能解决你的问题,请参考以下文章

如何找出Visual Studio发送给MSBuild的命令?

MSBuild、未解决的外部和 Visual Studio 2005

Visual Studio中的MSBuild项目

MSBuild 是不是需要安装 Visual Studio?

从Visual Studio构建定义UI添加MSBuild的引用搜索文件夹

如何只用visual c++编译器而不安装visual studio