2013-01-10 506 views
18

我想使用项目文件设置环境变量(例如.vcxproj)msbuild,如何设置环境变量?

我看着属性函数,但它似乎没有这样的功能。

我知道有一种方法来检索环境变量,但找不到如何设置它。

我觉得应该有办法在项目文件中设置环境变量。

回答

4

几件事情:

1)如果你只使用的MSBuild的环境变量,那么你可以使用,而不是试图设置环境变量

2标准的MSBuild变量)如果需要设置一个env var,那么它不是一个开箱即用的东西。您需要编写一个自定义任务,然后在项目文件中利用它。这是一个MSDN线程的链接,概述了如何做到这一点。
http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/0fb8d97d-513e-4d37-8528-52973f65a034

+0

谢谢你的回答! –

+1

请包括一个代码示例,链接不可信 – Rbjz

23

从MSBuild v4.0开始,编码任务可以放在项目文件中。就像这样:

<UsingTask 
    TaskName="SetEnvironmentVariableTask" 
    TaskFactory="CodeTaskFactory" 
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll"> 

    <ParameterGroup> 
    <Name ParameterType="System.String" Required="true" /> 
    <Value ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 

    <Task> 
    <Using Namespace="System" /> 
    <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
     Environment.SetEnvironmentVariable(Name, Value); 
     ]]> 
    </Code> 
    </Task> 

</UsingTask> 

注意,在MSBuild的14+,在AssemblyFile参考应该只是:

<Target Name="SampleTarget" BeforeTargets="Build"> 
    <SetEnvironmentVariableTask Name="TEST_ENV_VAR" Value="$(MSBuildProjectName)" /> 
</Target> 

那是多少:

AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" 

SetEnvironmentVariableTask可以从目标,然后使用比为小型MSBuild任务创作单独的.DLL更方便。

+0

尽我所能,我无法得到这与Visual Studio 2012.然而,我能找到一个解决方案[这里](http://stackoverflow.com/问题/ 5886938 /不能参考依赖性组件式-T4-模板时-使用-transformonbuil/20688714#20688714)。 –

+0

这似乎只在给定目标的情况下才起作用;当我试图从另一个目标读取env var时,它不存在了 – gschuager

+1

尝试Environment.SetEnvironmentVariable(Name,Value,EnvironmentVariableTarget.Machine)或Environment.SetEnvironmentVariable(Name,Value,EnvironmentVariableTarget.User)。默认值是Environment.SetEnvironmentVariable(名称,值,EnvironmentVariableTarget.Process) – herskinduk

0

您可能会考虑将环境变量作为SET XXX = $(XXX)行的序列写入文本文件(.cmd)。然后在命令窗口中执行.cmd。

例如使用所有SET命令定义ItemGroup,然后使用Task'WriteLinesToFile'将每个项目写入.cmd文本文件中的一行。

<ItemGroup> 
    <BuildEnvItem Include="REM This file is auto generated. Do not edit" /> 
    <BuildEnvItem Include="SET TEST_ENV_VAR=$(TEST_ENV_VAR)" /> 
    <!-- add more as needed --> 
<ItemGroup> 

<Target Name="DefineBuildEnvironmentVariables"> 
    <WriteLinesToFile File="Build_env.cmd" Lines="@(BuildEnvItem)" Overwrite="true" Encoding="Unicode"/> 
</Target> 

这对于存在使用msbuild的现有.cmd的情况可能会有用。初始.cmd使用msbuild生成Build_env.cmd,然后在继续之前调用Build_env.cmd。