Подтвердить что ты не робот

Msbuild, как установить переменные среды?

Я пытаюсь установить переменные среды, используя файл проекта (например .vcxproj)

Я посмотрел на функции свойств, но у него не было такой функции.

Я знаю, что есть способ получить переменную среды, но не смог найти, как ее установить.

Я чувствую, что должен быть способ установить переменные среды в файле проекта.

4b9b3361

Ответ 1

Несколько вещей:

1) Если вы используете только переменную в контексте MSBuild, вы можете просто использовать стандартные переменные MSBuild вместо того, чтобы пытаться установить переменную среды

2) Если вам нужно установить env var, ну, это не из-за коробки. Вам нужно написать настраиваемую задачу, а затем использовать ее в файле проекта. Здесь ссылка на поток MSDN, который описывает, как это сделать.
http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/0fb8d97d-513e-4d37-8528-52973f65a034

Ответ 2

Закодированная задача может быть вставлена ​​прямо в файл проекта с 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 должна быть просто:

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

SetEnvironmentVariableTask можно использовать из цели:

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

Это гораздо удобнее, чем создавать отдельный .DLL для небольших задач MSBuild.

Ответ 3

Возможно, вы захотите записать переменные среды в текстовый файл (.cmd) в виде последовательности строк SET XXX = $(XXX). Затем выполните .cmd в окне команд.

например. Определите ItemGroup со всеми командами SET, затем используйте 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>

Это может быть полезно в ситуации, когда существует существующий .cmd, который использует msbuild. Вначале .cmd использует msbuild для генерации Build_env.cmd, а затем вызывает Build_env.cmd перед продолжением.