MSBuild: установка определения препроцессора на основе свойства, обновленного в целевом объекте - PullRequest
0 голосов
/ 05 августа 2020

Итак, у нас есть переменная, которая в настоящее время является переменной окружения, и при загрузке sln она использует эту переменную, чтобы определить, какой проект активен, и выбирает определенные вещи, c для этого проекта (определение препроцессора) *

Вышеупомянутое работает с приведенной ниже ItemDefinitionGroup, но мы хотели бы отойти от переменных среды

<ItemDefinitionGroup>        
    <ClCompile>
      <PreprocessorDefinitions Condition="'$(GameItentifier)' == 'game1'">GAME_1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="'$(GameItentifier)' == 'game2'">GAME_2;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
</ItemDefinitionGroup>

Итак, это определение препроцесса позволяет называть его GAME_1 или GAME_2 устанавливается. У нас есть созданная dll, в которую мы можем загружать переменные из ini. Итак, внутри цели я могу обновить GameItentifier до игры 1 или игры 2 без необходимости использования переменной окружения.

Итак, моя проблема в том, что я не могу заставить препроцессор распознать изменение. Итак, в нашей самой ранней цели я поставил это. Эта цель запускается по мере появления вывода сообщения, и все последующие проверки GameItentifier показали, что они обновляются правильно.

  <UsingTask AssemblyFile="$bin\IniVars.dll" TaskName="msbuild.IniVarsInit" />
  <Target Name="SetGameItentifier">
    <IniVarsInit>
      <Output TaskParameter="IniVars" ItemName="IniVars"/>
    </IniVarsInit>    
    <PropertyGroup>
      <GameItentifier>%(IniVars.GameIdentifier)</GameItentifier>
    </PropertyGroup>
    <Message Text="GameItentifier: $(GameItentifier)" />
  </Target>

Итак, мой вопрос в том, как можно было бы получить эти значения препроцессора, установленные из значения GameItentifier из переопределение, а не окружение var?

Спасибо!

1 Ответ

0 голосов
/ 06 августа 2020

MSBuild: установка определения препроцессора на основе свойства, обновленного в целевом объекте

Традиционный способ не может решить вашу проблему. Мы предлагаем вам создать сценарий msbuild, а затем вызвать msbuild.exe , чтобы напрямую запустить сценарий для реализации вашего метода.

Причина

Убедитесь, что цель SetGameItentifier выполняется перед всем процессом сборки, и убедитесь, что MSBuild считывает свойство GameItentifier после того, как вы присвоите ему новое значение. В вашей функции нет возможности передать новое значение из настраиваемой цели SetGameItentifier , потому что MSBuild считывает все свойства очень рано. И тогда цель всегда запускается после того, как MSBuild прочитает все свойства, включая GameItentifier. Таким образом, ваше новое значение GameItentifier всегда после того, как MSbuild прочитает свойство GameItentifier при условии.

Таким образом, условие равно нулю и всегда false. Таким образом, проблема сохраняется.

Вы должны убедиться, что целевой SetGameItentifier выполняется до всего процесса сборки, чтобы он прошел успешно.

Решение

Вот мой метод:

1) сначала создайте сценарий с именем test.proj file и запишите основное содержимое в файл test.proj, а не в настраиваемый целевой файл:

Примечание : вы должны удалить эту цель, а затем поместить SetGameItentifier в test.proj напрямую

<Project>

    <UsingTask AssemblyFile="$bin\IniVars.dll" TaskName="msbuild.IniVarsInit" />
     
    <Target Name="SetGameItentifier">   
        <IniVarsInit>
          <Output TaskParameter="IniVars" ItemName="IniVars"/>
        </IniVarsInit>    
        <PropertyGroup>
          <GameItentifier>%(IniVars.GameIdentifier)</GameItentifier>
        </PropertyGroup>
        <Message Text="GameItentifier: $(GameItentifier)" />
     <MSBuild Projects="xxx\xxx.vcxproj(the path of the vcxproj file)" Targets="Build" Properties="GameItentifier=$(GameItentifier)"></MSBuild>   
      </Target>

</Project>

2 ) Затем оставьте остальной контент, который вы показываете, без изменений, в файле xxx.vcxproj и добавьте только дополнительную цель с именем showPara, чтобы показать свойство PreprocessorDefinitions.

добавьте это в файл vcxproj:

<Target Name="showPara" AfterTargets="Build">
    <Message Importance="high" Text="%(ClCompile.PreprocessorDefinitions)==============$(GameItentifier)"></Message>
</Target>

3) откройте Командную строку разработчика для VS2019 и введите

msbuild xxx\test.proj -t:SetGameItentifier -v:detailed

Тогда вы увидите результат, как мы и ожидали .

введите описание изображения здесь

===============================

Кроме того , вы также можете создать bat-файл для автоматической сборки.

1) Создайте файл с именем build.bat, а затем добавьте в него:

        call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" 
        ECHO Bulding !!!
        
        ECHO Building ...
        msbuild C:\xxx\test.rpoj -t:SetGameItentifier -v:detailed
   

2) Когда вы щелкаете по нему, он автоматически создает указанный c файл.

...