我有一个用于构建多个 C++ 项目 (*.vcproj) 的 msbuild 项目文件。这是典型项目文件的一部分,其中构建的全局环境变量被覆盖为属性:
<PropertyGroup>
<MYBINDIR>d:\buildsysroot\bin</MYBINDIR>
<MYLIBDIR>d:\buildsysroot\lib</MYLIBDIR>
...
</PrpertyGroup>
<ItemGroup>
<MyItems Include="d:\buildsysroot\myproject\myproject.vcproj"/>
</ItemGroup>
<Target Name="Release_x64">
<VCBuild Projects="@(MyItems)" Configuration="Release_dll|x64"/>
</Target>
所有 vcproj 文件都通过属性表使用这些环境变量。这是 vcproj 的摘录:
<Configuration
Name="Release_dll|x64"
ConfigurationType="1"
InheritedPropertySheets="$(BUILDPROPSDIR)\defaults.vsprops;$(BUILDPROPSDIR)\build_dll.vsprops"
>
这就是属性表的外观:
<VisualStudioPropertySheet
Name="defaults"
OutputDirectory="$(MYBINDIR)\_$(ConfigurationName)_$(PlatformName)"
IntermediateDirectory="$(MYBUILDDIR)_$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
>
<Tool
Name="VCLinkerTool"
AdditionalLibraryDirectories=""$(MYLIBDIR)""
/>
<VisualStudioPropertySheet/>
问题是:在构建时,在 msbuild 文件(MYBINDIR,MYLIBDIR)中声明的环境变量的值不会进入属性表,但似乎仅在 msbuild 文件中是本地的:在 msbuild 项目中,MYBINDIR 扩展为“d:\buildsysroot\bin”,但在 vc 项目中 MYBINDIR 扩展为“d:\projects\bin”,这是我全局设置的值(例如通过 MyComputer->Advanced->EnvironmentVariables)并且必须保留在那里因为这是我的主要开发环境的设置方式。
如何将 msbuild 文件中设置的环境传递给 VCBuild 任务?
我知道这个问题可以通过使用批处理文件并使用“set”声明环境来解决,而不是在 msbuild 文件中;这就是我过去的做法,但我更喜欢上面的方法,因为它只是对带有一个参数的 msbuild 的一次调用,仅此而已。
编辑
我需要一个快速的解决方案,并想出了一个自定义任务,它以与批处理文件相同的方式设置环境,但在 msbuild 中执行它的好处是。任务的 Execute() 方法只是执行 Environment.SetEnvironmentVariable(var , 值)。这仍然需要设置过程的环境,我很高兴听到是否有其他方法!