$ (SolutionDir) Свойство MSBuild неверно при запуске Sandbule Help File Builder через CMD

Когда я запускаю файл проекта Sandcastle Help File Builder (например, myproject.shfbproj) с помощью Windows CMD, я получаю досадную проблему: $(SolutionDir) имеет то же значение, что и $(ProjectDir), и это означает, что источники документации проекта выиграли не правильно, потому что я добавляю пользовательские цели, которые уже используют $(SolutionDir).

Если я соберу весь построитель файлов справки Sandcastle из Visual Studio, он будет построен успешно.

Я использую следующую команду (выполняется из каталога, где хранится проект):

"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /p:Configuration=Development myproject.shfbproj

Есть ли обходной путь для этого?

Ответ 1

Хотя @m0sa указал на очень очевидный факт (поскольку я собираю проект построителя файлов справки Sandcastle, в нем нет фактического каталога решения), эта проблема также возникала во время сборки TFS при создании решения, где так называемый проект документации проживает.

На данный момент мне удалось решить проблему, используя неприятный обходной путь: добавление свойства SolutionDir в каждый проект С#, который необходимо построить как часть проекта документации:

  <PropertyGroup>
    <SolutionDir>$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory)))\</SolutionDir>
  </PropertyGroup>

Поскольку мой файл решения всегда будет находиться в родительском каталоге каталога проекта Sandcastle Help File Builder, в моем случае этот обходной путь работает...

Теперь ссылки на проекты в качестве источников документации могут импортировать пользовательский проект, в котором я определяю общие свойства MSBuild как в сборках Visual Studio, так и во внешних:

<Import Project="$(SolutionDir)MSBuild\Common.properties" />

Ответ 2

Вы получите правильный $(SolutionDir) если строите свое решение (файл .sln). .shfbproj является файлом проекта, и поэтому не имеет ссылки на его родительское решение. Вы можете попробовать явно указать $(SolutionDir) в командной строке:

msbuild /p:Configuration=Development /p:SolutionDir=MySolutionDir myproject.shfbproj

Для справки: $ (SolutionDir) и MSBuild