Msbuild, как установить переменные среды?
Я пытаюсь установить переменные среды, используя файл проекта (например .vcxproj)
Я посмотрел на функции свойств, но у него не было такой функции.
Я знаю, что есть способ получить переменную среды, но не смог найти, как ее установить.
Я чувствую, что должен быть способ установить переменные среды в файле проекта.
Ответы
Ответ 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 перед продолжением.