通过msbuild设置vcbuild环境

通过msbuild设置vcbuild环境,msbuild,environment-variables,vcbuild,Msbuild,Environment Variables,Vcbuild,我有一个MSBug项目文件,用于构建几个C++项目(*.vcProj.)。以下是典型项目文件的一部分,其中生成的全局环境变量作为属性被覆盖: <PropertyGroup> <MYBINDIR>d:\buildsysroot\bin</MYBINDIR> <MYLIBDIR>d:\buildsysroot\lib</MYLIBDIR> ... </PrpertyGroup> <ItemGroup>

我有一个MSBug项目文件,用于构建几个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>

d:\buildsysroot\bin
d:\buildsysroot\lib
...
所有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)。
这仍然需要设置进程的环境,我很高兴听到是否有其他方法

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

我不知道这是否与您尝试执行的操作有关。但是您在VCBuild任务上尝试过“Override”属性吗?如何使用它并不明显。但是我让VS为我创建了一个.vsprops,它具有我所关心的属性(OutputDirectory和mediateDirectory)。然后,我编辑了.vcproj文件以删除它添加的InheritedPropertySheets属性。然后,我在MSBuild文件中向VCBuild任务添加了一个覆盖属性。这似乎给了我想要的行为。可能是另一个问题,不过


Donnie

感谢您的想法:确实可以创建一个在主msbuild项目文件中使用环境变量的自定义属性表(使用WriteListFile;因为它是在主文件中完成的,所以所有变量都可以执行)。现在,我的每个项目都使用了3个使用环境变量的属性表,因此使用这种方法,我基本上会在每次构建之前重写所有这些属性表,可能会引入与原始属性表不匹配的情况,所以我将继续设置流程环境