我对 MSBuild.exe 和环境变量有疑问。一、开发环境:
代码主要是 C++ 和一些 C#。有超过 5,000 个类、340 个项目和 200 个解决方案排列在一个深度源代码树中。在树的根部和树中的各个其他点都有一个解决方案。我们使用 TFS 并为一系列未来版本维护多个活动分支。每个开发人员都使用本地视图来修改和测试代码。一些开发人员同时在多个分支上工作。有时开发人员会同时从不同的 TFS 分支构建解决方案。
我们使用大约 70 个环境变量来定位共享头文件、库等。在 VS2008 中,我们使用与解决方案文件具有相同基本名称的文件和 .slnenv 的扩展名来定义环境变量。所有变量都是相对于源树的基础定义的。这个 .slnenv 文件由自定义的 VS2008 AddIn 读取,该插件在 VS2008 进程空间中创建环境变量,即
MyProjectDir=$(SolutionDir)\..\..
MyRoot=$(MyProjectDir)\..\..
MyInstallDir=$(MyRoot)\Install
MySourceDir=$(MyRoot)\Source
MyUnmanagedSourceDir=$(MySourceDir)\My\Unmanaged
MyIncludeDirs=$(MyProjectDir);$(MyUnmanagedSourceDir)
此插件无法与 VS2010 一起正常工作,因为 MSBuild 不继承加载解决方案后创建的环境变量。
我的问题是如何将这些环境变量添加到 MSBuild?我发现了两种可行的方法,但不如我们一直使用的 AddIn 方便。
VS2010 可以通过命令脚本启动,该脚本首先在进程空间中设置环境变量,然后启动 VS2010。MSBuild 确实继承了这些环境变量。这是不能令人满意的,因为脚本需要针对可以加载解决方案的各个点进行定制。
我尝试的第二种方法是将环境变量定义为属性表和 .vcxproj 文件中的属性。我们有一个所有 .vcxproj 文件都加载的基本属性表。在该属性表中:
<PropertyGroup>
<MyRoot>$(MyProjectDir)\..\..</MyRoot>
<MyInstallDir>$(MyRoot)\Install</MyInstallDir>
<MySourceDir>$(MyRoot)\Source</MySourceDir>
<MyUnmanagedSourceDir>$(MySourceDir)\My\Unmanaged</MyUnmanagedSourceDir>
<MyIncludeDirs>$(MyProjectDir);$(MyUnmanagedSourceDir)</MyIncludeDirs>
</PropertyGroup>
然后我可以在每个 .vcxproj 文件中定义基本目录:
<PropertyGroup>
<MyProjectDir>..\..</MyProjectDir>
</PropertyGroup>
此方法使用相对路径名,其中 AddIn 将所有环境变量解析为绝对路径名。我宁愿不必编辑 340 个 .vcxproj 文件,其中“MyProjectDir”的定义会根据项目文件离源根目录的距离而有所不同。到目前为止,我只在一个项目中尝试过这种方法。
我试图修改插件以创建属性而不是环境变量。我尝试使用 ENV2.get_Properties(),但这似乎只适用于 VS2010 中定义的属性,不适用于我定义的属性。
谢谢你,丹·卡里