代码主要由C++和一些C#组成。有超过5000个类、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?我找到了两种方法,但它们不像我们之前使用的插件那么方便。
第一种方法是使用命令脚本启动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"的定义会根据项目文件位于源根目录的距离而变化。到目前为止,我只在一个项目中尝试了这种方法。
我尝试修改AddIn以创建属性而不是环境变量。我尝试使用ENV2.get_Properties(),但那似乎只适用于在VS2010中定义的属性,而不适用于我定义的属性。
谢谢, 丹·凯瑞