MSBuild: преобразовать относительный путь в импортированном проекте в абсолютный путь - PullRequest
2 голосов
/ 11 июня 2010

Короткая версия:

У меня есть проект MSBuild, который импортирует другой проект. В импортируемом проекте есть свойство, содержащее относительный путь относительно местоположения импортируемого проекта. Как мне преобразовать этот относительный путь в абсолютный? Я пытался выполнить задачу ConvertToAbsolutePath, но это делает ее относительно местоположения импортируемого проекта).

Длинная версия:

Я пытаюсь выполнить задачу MSBuild Роберта Коритника по интеграции вывода nunit в Visual Studio (см. этот другой SO-вопрос для ссылки). Поскольку мне нравится, что все мои инструменты находятся под контролем версий, я хочу, чтобы целевой файл с пользовательской задачей указывал на консольное приложение nunit, используя относительный путь.

Моя проблема в том, что этот относительный путь заканчивается относительно проекта импорта.

например. (в ... MyRepository \ Third Party \ NUnit \ MSBuild.NUnit.Task.Source \ bin \ Release \ MSBuild.NUnit.Task.Targets):

...
  <PropertyGroup Condition="'$(NUnitConsoleToolPath)' == ''">
    <NUnitConsoleToolPath>..\..\..\NUnit 2.5.5\bin\net-2.0</>
  </PropertyGroup>  
...
  <Target Name="IntegratedTest">
    <NUnitIntegrated
      TreatFailedTestsAsErrors="$(NUnitTreatFailedTestsAsErrors)"
      AssemblyName="$(AssemblyName)"
      OutputPath="$(OutputPath)"
      ConsoleToolPath="$(NUnitConsoleToolPath)"
      ConsoleTool="$(NUnitConsoleTool)"
    />
  </Target>
...

Указанная выше цель завершается неудачно с ошибкой, что файл не может быть найден (то есть файл nunit-console.exe). Внутри задачи NUnitIntegrated MSBuild при вызове метода execute () текущим каталогом является каталог проекта , импортирующего , поэтому относительные пути будут указывать на неправильное местоположение.

Я попытался преобразовать относительный путь в абсолютный, добавив следующие задачи в цель IntegratedTest:

<ConvertToAbsolutePath Paths="$(NUnitConsoleToolPath)">
  <Output TaskParameter="AbsolutePaths" PropertyName="AbsoluteNUnitConsoleToolPath"/>
</ConvertToAbsolutePath>

но это просто преобразовало его в каталог файла проекта, который импортирует этот целевой файл.

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

Может кто-нибудь сказать мне, как путь в импортированном файле, который должен быть относительно каталога, в котором находится импортируемый файл, может быть сделан абсолютным?

Спасибо!

1 Ответ

4 голосов
/ 11 июня 2010

Вам необходимо определить относительный путь с помощью MSBuildProjectDirectory

Импортируемый проект:

<PropertyGroup>
  <RelativePathToProject>subdir\</RelativePathToProject>
</PropertyGroup>

<Import Project="$(RelativePathToProject)SubSample.proj"/>

<Target Name="GetNUnitConsolePath">
  <Message Text="NUnitConsoleToolPath : %(NUnitConsoleToolPath.FullPath)"/>
</Target>

Импортированный файл проекта:

<ItemGroup>
  <NUnitConsoleToolPath 
     Include="$(MSBuildProjectDirectory)\$(RelativePathToProject)..\..\..\NUnit 2.5.5\bin\net-2.0"/>
</ItemGroup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...