我有一个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=""$(MYLIBDIR)""
/>
<VisualStudioPropertySheet/>问题是:在构建时,msbuild文件( MYBINDIR,MYLIBDIR)中声明的环境变量的值并不是将其放入属性表中,而是似乎仅是msbuild文件的本地变量:在msbuild项目MYBINDIR中扩展到"d:\buildsysroot\bin",但在vc项目MYBINDIR中,MYBINDIR扩展到"d:\projects\bin",这是我在全局设置的值(例如通过MyComputer->Advanced-> environment variables设置的值),并且必须保持在那里,因为它是如何设置我的主要开发环境的。
如何将msbuild文件中的环境集传递给VCBuild任务?
我知道这个问题可以通过使用批处理文件并使用'set‘声明环境来解决,而不是在msbuild文件中声明;这就是我以前所做的,但是我更喜欢上面的方法,因为它只是一个带有一个参数的msbuild调用,也就是它。
编辑
我需要一个快速的解决方案,并想出了一个自定义任务,它以批处理文件的方式设置环境,但是在msbuild中这样做的好处是。任务的Execute()方法只执行Environment.SetEnvironmentVariable( var,val )。这仍然需要设置过程的环境,我很高兴听到如果有其他方式!
发布于 2009-12-01 20:17:22
由于没有其他人回答/评论,所以我将使用自己的答案:使用Environment.SetEnvironmentVariable( var,val )设置进程环境的自定义任务。
发布于 2009-12-09 22:15:41
我不知道这是否符合你想做的事。但是,您是否尝试过VCBuild任务上的“覆盖”属性?如何使用它并不是显而易见的。但是我有VS用我关心的属性(OutputDirectory和IntermediateDirectory)为我创建了一个OutputDirectory。然后,我编辑了.vcproj文件以删除它添加的InheritedPropertySheets属性。然后,我在我的VCBuild文件中向MSBuild任务添加了一个覆盖属性。这似乎给了我我想要的行为。可能是另一个问题,不过.
唐尼
https://stackoverflow.com/questions/1803630
复制相似问题