Как я могу убедиться, что мой Directory.Build.props наследует значения по умолчанию и добавляет мои пользовательские параметры?
Я думаю, вы не можете использовать Directory.Build.props
для перезаписи системы свойство в пользовательском интерфейсе свойства проекта.
По вашим данным, LibraryPath
и IncludePath
потеряли там значения. Обратите внимание, что эта информация о порядке импорта Directory.Build.props
:
Directory.Build.props импортирована в Microsoft.Common.props очень рано, и свойства, определенные позже, для нее недоступны. Поэтому избегайте ссылок на свойства, которые еще не определены (и будут иметь пустое значение).
Directory.Build.targets импортирован из Microsoft.Common.targets после импорта файлов .targets из пакетов NuGet. Таким образом, он может переопределять свойства и цели, определенные в большинстве логов сборки c, но иногда вам может понадобиться настроить файл проекта после окончательного импорта.
Вы можете обратиться к эта ссылка .
Подробно, Directory.Build.props
как шаг для инициализации проекта и всегда запускается до Microsoft.Common.props
, который устанавливает значения по умолчанию для большинства системных свойств, таких как LibraryPath
и IncludePath
. Поэтому в начале, это нормально, что значения пусты. После этого, когда он выполняет Microsoft.Common.props
, он имеет следующее:
<Includepath Condidtion="'$(Includepath)'==''">$(VC_IncludePath)......</Includepath >
И вы добавляете $(BOOST_ROOT)\lib32-msvc-14.2
к Includepath
в Directory.Build.props
, поэтому при выполнении следующего шага Includepath
имеет значение, поэтому он пропускает операцию назначения системных значений и не перезаписывает значения на этом шаге и вызывает это странное поведение.
Для Directory.Build.targets
он выполняет операцию переопределения на конец, когда оба свойства includepath и LibraryPath получили системные значения, и с переопределением проблем нет. Но вы можете получить эти значения только при запуске проекта, как вы показали позже.
Вкратце, Directory.Build.props
подходит для определения некоторых свойств, которые будут использоваться или перезаписаны позже, а Directory.Build.targets
подходит для перезаписывая значения, которые уже определены в процессе сборки.
Предложение
1) Чтобы установить включаемые каталоги, вы можете добавить их в свой ВКЛЮЧИТЬ переменную окружения. Вы можете установить переменные INCLUDE и LIB следующим образом:
set INCLUDE=xxxx
set LIB=xxxx\lib32-msvc-14.2
И затем добавить /p:"VCBuildAdditionalOptions= /useenv"
к аргументам MSBuild, чтобы он принимал переменные INCLUDE и LIB.
Вы можете обратиться к this .
2) Или вы можете использовать свою начальную функцию в пути C:\Users\UserName\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.xxx.user.props
, чтобы добавить в нее дополнительный includepath, librarypath, например:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets">
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<IncludePath>C:\any-name\include;$(IncludePath)</IncludePath>
<LibraryPath>C:\any-name\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup />
<ItemGroup />
</Project>
Надеюсь, это поможет вам.