2013-01-10 132 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。