Событие предварительной сборки в Visual Studio, заменяющее $ (SolutionDir) на * Undefined * - PullRequest
25 голосов
/ 11 марта 2009

Я считаю, что проблема задокументирована здесь перенесено сюда и похоже, что это может быть ошибкой в ​​visual studio, но мне интересно, знает ли кто-нибудь обходного пути.

По сути, у меня есть следующие две строки (среди прочего) одна за другой в событии предварительной сборки.

"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "$(SolutionDir)Folder1\Project1.csproj"

"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "$(SolutionDir)Folder2\Folder3\Project2.csproj" 

Первый преуспевает, а другой проваливается, говоря, что The command ""C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "*Undefined*Folder2\Folder3\Project2.csproj"" exited with code 1..

Edit:
Выяснилось, что проблема заключалась в том, что один из других проектов с той же строкой, что и предварительная сборка, потерпел неудачу, поскольку сама MSBuild не знает о макросах.

Ответы [ 3 ]

60 голосов
/ 17 декабря 2013

Я исправил это, заменив все $(SolutionDir) на $(ProjectDir)..\.

Это было связано с тем, что MSBuild выполнял каждый проект независимо, и, следовательно, не являлось решением. В VS2010 он работал нормально, но не на сервере сборки.

0 голосов
/ 16 января 2019

Ответ Аллана находится на правильном пути, но если вы хотите перейти в родительский каталог ProjectDir, или вывод $(ProjectDir)..\ будет string, вам нужно выполнить Операция «перейти в родительский каталог» в msbuild .
Вот как вы можете добиться этого:

<PropertyGroup>
  <TrimmedDir>$([System.IO.Path]::GetDirectoryName($(ProjectDir)))</TrimmedDir>
</PropertyGroup>

Этот код устанавливает путь к родительскому каталогу переменной ProjectDir в TrimmedDir. [System.IO.Path]::GetDirectoryName() выполняет эту операцию.

0 голосов
/ 11 марта 2009

Вы не указываете, происходит ли это для многих проектов или только для одного или двух.

Если это только в одном или двух проектах, временным обходным решением может быть замена $ (SolutionDir) на явный путь, в котором находится папка 2. Например, что-то вроде:

"C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" /p:configuration=Release;platform=x86 /t:rebuild "C:\AllSolutions\ExampleSolutions\Folder2\Folder3\Project2.csproj"

но с правильным путем для вашего проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...