0

我有一个用于构建多个 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="&quot;$(MYLIBDIR)&quot;"
  />
<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 , 值)。这仍然需要设置过程的环境,我很高兴听到是否有其他方法!

4

2 回答 2

0

因为没有其他人回答/评论我将使用我自己的答案:使用 Environment.SetEnvironmentVariable(var, val) 设置进程环境的自定义任务

于 2009-12-01T20:17:22.227 回答
0

我不知道这是否符合你想要做的事情。但是您是否尝试过 VCBuild 任务的“覆盖”属性?如何使用它并不明显。但是我让 VS 使用我关心的属性(OutputDirectory 和 IntermediateDirectory)为我创建了一个 .vsprops。然后我编辑了 .vcproj 文件以删除它添加的 InheritedPropertySheets 属性。然后我在我的 MSBuild 文件中为 VCBuild 任务添加了一个 Override 属性。这似乎给了我我正在寻找的行为。可能是一个不同的问题,虽然......

唐尼

于 2009-12-09T22:15:41.897 回答