web-dev-qa-db-fra.com

msbuild, comment définir les variables d'environnement?

J'essaie de définir des variables d'environnement à l'aide d'un fichier de projet (ex. .Vcxproj)

J'ai regardé les fonctions de la propriété mais cela ne semblait pas avoir cette fonction.

Je sais qu'il existe un moyen de récupérer la variable d'environnement, mais je ne trouve pas comment le définir.

Je pense qu'il devrait y avoir moyen de définir des variables d'environnement dans un fichier de projet.

20
in His Steps

Un certain nombre de choses:

1) Si vous utilisez uniquement la variable dans le contexte de MSBuild, vous pouvez simplement utiliser les variables standard MSBuild au lieu d'essayer de définir une variable d'environnement.

2) Si vous devez définir une variable env, eh bien, ce n'est pas une solution originale. Vous devez écrire une tâche personnalisée, puis l'exploiter dans le fichier de projet. Voici un lien vers un thread MSDN qui explique comment procéder.
http://social.msdn.Microsoft.com/forums/en-US/msbuild/thread/0fb8d97d-513e-4d37-8528-52973f65a034

5
Nick Nieslanik

La tâche codée peut être placée directement dans le fichier de projet depuis MSBuild v4.0. Comme ça:

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

Notez que dans MSBuild 14+, la référence AssemblyFile doit être simplement:

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

La SetEnvironmentVariableTask peut ensuite être utilisée à partir de la cible:

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

C'est beaucoup plus pratique que de créer un fichier .DLL séparé pour les petites tâches MSBuild.

27
ogggre

Vous pouvez envisager d'écrire les variables d'environnement dans un fichier texte (.cmd) en tant que séquence de lignes SET XXX = $ (XXX). Puis exécutez le .cmd dans la fenêtre de commande.

par exemple. Définissez un ItemGroup avec toutes les commandes SET, puis utilisez la tâche 'WriteLinesToFile' pour écrire chaque élément sur une ligne du fichier texte .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>

Cela peut être utile dans le cas où un fichier .cmd existant utilise msbuild. Le fichier .cmd initial utilise msbuild pour générer le fichier Build_env.cmd, puis appelle Build_env.cmd avant de continuer.

0
Richard Scott