Вопрос

У меня есть файл проекта msbuild, который используется для создания нескольких проектов на C ++ (* .vcproj).Вот часть типичного файла проекта, в котором глобальные переменные среды для сборки переопределяются как свойства:

<PropertyGroup>
  <MYBINDIR>d:\buildsysroot\bin</MYBINDIR>
  <MYLIBDIR>d:\buildsysroot\lib</MYLIBDIR>
  ...
</PrpertyGroup>

<ItemGroup>
  <MyItems Include="d:\buildsysroot\myproject\myproject.vcproj"/>
</ItemGroup>

<Target Name="Release_x64">
  <VCBuild Projects="@(MyItems)" Configuration="Release_dll|x64"/>
</Target>

Эти переменные среды используются всеми файлами vcproj через таблицы свойств.Вот выдержка из vcproj:

<Configuration
  Name="Release_dll|x64"
  ConfigurationType="1"
  InheritedPropertySheets="$(BUILDPROPSDIR)\defaults.vsprops;$(BUILDPROPSDIR)\build_dll.vsprops"
>

И вот как выглядят таблицы свойств:

<VisualStudioPropertySheet
  Name="defaults"
  OutputDirectory="$(MYBINDIR)\_$(ConfigurationName)_$(PlatformName)"
  IntermediateDirectory="$(MYBUILDDIR)_$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
  >
  <Tool
    Name="VCLinkerTool"
    AdditionalLibraryDirectories="&quot;$(MYLIBDIR)&quot;"
  />
<VisualStudioPropertySheet/>

Проблема в том, что:при сборке значения переменных среды, объявленных в файле msbuild (MYBINDIR, MYLIBDIR), не попадают в таблицы свойств, но кажутся локальными только для файла msbuild:в проекте msbuild MYBINDIR расширяется до "d:\buildsysroot\bin", но в проекте vc MYBINDIR расширяется до "d:\projects\bin ", это значение, которое я устанавливаю глобально (например, через MyComputer-> Advanced-> EnvironmentVariables) и который должен остаться там, потому что именно так настроена моя основная среда разработки.

Как мне передать среду, заданную в файле msbuild, задаче VCBuild?

Я знаю, что эту проблему можно было бы решить, используя пакетный файл и объявив среду там с помощью 'set', а не в файле msbuild;именно так я привык это делать, но я предпочитаю метод, описанный выше, поскольку это всего лишь один вызов msbuild с одним аргументом, и все.

Редактировать

Мне нужно было быстро найти решение, и я придумал пользовательскую задачу, которая настраивает среду таким же образом, как это делал бы пакетный файл, но с преимуществом выполнения этого в msbuild..Метод Execute() задачи просто выполняет Environment.SetEnvironmentVariable(var, val).Это все еще требует настройки среды процесса, я был бы рад услышать, есть ли другой способ!

Это было полезно?

Решение

поскольку больше никто не ответил / не прокомментировал, я предлагаю свой собственный ответ:пользовательская задача, которая задает среду процесса с помощью Environment.SetEnvironmentVariable(var, val)

Другие советы

Я не знаю, относится ли это к тому, что вы пытаетесь сделать.Но пробовали ли вы атрибут "Переопределить" в задаче VCBuild?Не совсем очевидно, как это использовать.Но я попросил VS создать для меня файл .vsprops с нужными мне атрибутами (outputDirectory и IntermediateDirectory).Затем я отредактировал файл .vcproj, чтобы удалить атрибут InheritedPropertySheets, который он добавил.Затем я добавил атрибут Переопределения к задаче VCBuild в моем файле MSBuild.Кажется, это дало мне то поведение, которое я искал.Хотя, возможно, проблема в другом...

Донни

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top