Включение компилятора Nemerle в репозиторий кода
Я пытаюсь включить компилятор Nemerle в мой репозиторий исходного кода, чтобы он мог быть собран без установки Nemerle на сервере сборки. В настоящее время мой каталог исходного кода выглядит следующим образом:
- [MySolutionFolder]
--- [.build]
------ [Nemerle]
--------- [net-4.0]
------------ ncc.exe
------------ ncc32.dll
------------ Nemerle.dll
------------ Nemerle.MSBuild.targets
------------ { all other Nemerle requirements }
--- [MyNemerleProjectFolder]
------ MyNemerleProject.nproj
------ { various .n files }
--- MySolution.sln
--- build.bat
Файл build.bat - это простой скрипт, который вызывает MSBuild для файла.sln.
В моем файле.nproj я изменил строку
<Nemerle Condition=" '$(Nemerle)' == '' ">$(NemerleBinPathRoot)\$(NemerleVersion)</Nemerle>
чтобы:
<Nemerle Condition=" '$(Nemerle)' == '' ">$(SolutionDir).build\Nemerle\$(NemerleVersion)</Nemerle>
После этого изменения я могу успешно выполнить сборку из сценария командной строки, однако не могу открыть решение в Visual Studio. Открывая решение, VS жалуется, что не может найти MySolutionFolder\MyNemerleProjectFolder\.build\Nemerle\net-4.0\Nemerle.MSBuild.targets
Почему Visual Studio ищет каталог.build в папке проекта, а не в папке решения? Есть ли обходной путь для этого?
Если я изменю это на:
<Nemerle Condition=" '$(Nemerle)' == '' >$(ProjectDir)..\.build\Nemerle\$(NemerleVersion)</Nemerle>
Тогда решение откроется в visual studio, но сборка завершится неудачно - сборка из командной строки завершится неудачно.
2 ответа
Попробуйте использовать $(MSBuildProjectDirectory) вместо $(ProjectDir). Например:
<Nemerle Condition=" '$(Bootstrapping)' == 'true' ">$(MSBuildProjectDirectory)\..\Boot\$(NemerleVersion)</Nemerle>
<Nemerle Condition=" '$(Bootstrapping)' == 'false' ">$(NemerleBinPathRoot)\$(NemerleVersion)</Nemerle>
Похоже, ошибка в Visual Studio.
Что вы можете сделать, это указать событие перед сборкой, которое создаст символическую ссылку из $(ProjectDir).build
в $(SolutionDir).build
,
Да, хак.