【问题标题】:set vcbuild environment through msbuild通过msbuild设置vcbuild环境
【发布时间】:2009-11-26 13:20:01
【问题描述】:

我有一个 msbuild 项目文件,用于构建多个 C++ 项目 (*.vcproj)。这是一个典型项目文件的一部分,其中构建的全局环境变量被覆盖为属性:

<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, val)。 这仍然需要设置过程的环境,如果有其他方法,我很高兴听到!

【问题讨论】:

    标签: msbuild environment-variables vcbuild


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      唐尼

      【讨论】:

      • 感谢您的想法:确实可以在主 msbuild 项目文件中创建一个使用环境变量的自定义属性表(使用 WriteLinesToFile;因为它在主文件中完成,所有 vars 都可以作为预期)。现在,我的每个项目都使用了 3 个使用环境变量的属性表,所以通过这种方法,我基本上会在每次构建之前重写所有这些属性表,可能会导致与原始属性表不匹配,所以我会坚持使用设置流程环境
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2013-01-09
      • 2016-01-23
      相关资源
      最近更新 更多