2013-01-10 14 views
18

Sto cercando di impostare le variabili di ambiente utilizzando il file di progetto (ex .vcxproj)msbuild, come impostare le variabili di ambiente?

Ho esaminato le funzioni di proprietà ma non sembrava avere tale funzione.

So che esiste un modo per recuperare la variabile di ambiente ma non è stato possibile trovare come impostarla.

Mi sento come dovrebbe essere il modo per impostare le variabili di ambiente nel file di progetto.

risposta

4

Un paio di cose:

1) Se si sta utilizzando solo la variabile nel contesto di MSBuild, allora si può solo utilizzare le variabili standard MSBuild invece di cercare di impostare una variabile d'ambiente

2) Se è necessario impostare un env var, beh, non è una cosa pronta per l'uso. È necessario scrivere un'attività personalizzata e quindi sfruttarla nel file di progetto. Ecco un collegamento a un thread MSDN che illustra come eseguire questa operazione.
http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/0fb8d97d-513e-4d37-8528-52973f65a034

+0

Grazie per la risposta! –

+1

Si prega di includere un esempio di codice, i collegamenti non sono attendibili – Rbjz

23

L'attività codificata può essere inserita direttamente nel file di progetto da MSBuild v4.0. Come questo:

<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> 

Si noti che in MSBuild 14+, il riferimento AssemblyFile dovrebbe essere solo:

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

Il SetEnvironmentVariableTask può essere poi utilizzato dal target:

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

che è molto più pratico che creare un file .DLL separato per le attività di MSBuild di piccole dimensioni.

+0

Prova come potrei, non ho potuto farlo funzionare con Visual Studio 2012. Tuttavia, sono stato in grado di trovare una soluzione [qui] (http://stackoverflow.com/ non-reference-dipendenza-assiemi-in-t4-modello-quando-con-transformonbuil domande/5.886.938/cAN/20.688.714 # 20.688.714). –

+0

Sembra funzionare solo nel contesto di un dato obiettivo; quando ho provato a leggere l'env var da un'altra destinazione non c'era più – gschuager

+1

Provare Environment.SetEnvironmentVariable (Name, Value, EnvironmentVariableTarget.Machine) o Environment.SetEnvironmentVariable (Name, Value, EnvironmentVariableTarget.User). L'impostazione predefinita è Environment.SetEnvironmentVariable (Name, Value, EnvironmentVariableTarget.Process) – herskinduk

0

Si potrebbe considerare di scrivere le variabili di ambiente in un file di testo (.cmd) come sequenza di righe SET XXX = $ (XXX). Quindi esegui .cmd nella finestra di comando.

ad es. Definire un Gruppo Oggetti con tutti i comandi SET, quindi utilizzare Task "WriteLinesToFile" per scrivere ciascun elemento su una riga nel file di testo .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> 

Questo può essere utile nella situazione in cui esiste un .cmd esistente che utilizza msbuild. L'iniziale .cmd utilizza msbuild per generare Build_env.cmd, quindi chiama Build_env.cmd prima di procedere.

Problemi correlati