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 файл.