Как импортировать проект msbuildcommunitytasks из другого проекта msbuild с относительным путем к файлу? - PullRequest
9 голосов
/ 22 января 2010

Пожалуйста, будьте спокойны, я новичок в msbuild и msbuildtasks!

Как я могу установить свойство, которое представляет относительный путь файла к целевому файлу, который я хочу импортировать? Мне нужны относительные ссылки, чтобы они работали на всех машинах разработчиков. Но цель для импорта пытается использовать относительный внутренний путь к файлу, который не будет работать, поскольку он переоценивается относительно импортируемой цели!

По сути, я пытаюсь обойти задокументированное поведение импортированных проектов:

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

Ответы [ 6 ]

15 голосов
/ 22 января 2010

Был похожий вопрос на Можно ли использовать MSBuild Extension Pack без установки? . Этот вопрос заключался в том, как сделать то же самое с MSBuild Extension Pack , оба из которых похожи в этом аспекте. Для пакета расширения вы должны объявить свойство ExtensionTasksPath , а для задач сообщества вы должны объявить аналогичное свойство с именем MSBuildCommunityTasksLib . Так что в вашем случае это должно выглядеть так:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <MSBuildCommunityTasksLib Condition="'$(MSBuildCommunityTasksLib)' == ''">E:\Data\Development\My Code\Community\MSBuild\CommunityTasks\</MSBuildCommunityTasksLib>
  </PropertyGroup>

  <Import Project="$(MSBuildCommunityTasksLib)MSBuild.Community.Tasks.Targets"/>

  <Target Name="Demo">
    <!-- Use the tasks here -->
  </Target>

</Project>
6 голосов
/ 11 октября 2011

@ Сайед Ибрагим Хашими

Поговорим о MSBuild4 Просто объявление MSBuildCommunityTasksLib не будет достаточной причиной, если вы проверяете файл MSBuild.Community.Tasks.Targets, свойства объявляются следующим образом

<PropertyGroup>
    <MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
    <MSBuildCommunityTasksLib>$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll</MSBuildCommunityTasksLib>
  </PropertyGroup>

Так что, если U только превысит MSBuildCommunityTasksLib, он снова перегрузится в файле MSBuild.Community.Tasks.Targets, поскольку он не является условным Так что вы должны также переопределить MSBuildCommunityTasksPath, чтобы его свойство было установлено не из MSBuildExtensionsPath, а из пользовательского пути. Пойми меня, если я ошибаюсь

5 голосов
/ 22 января 2010

Хорошо, я нашел ответ. По сути, вы должны установить свойство MSBuildCommunityTasksPath как относительный путь назад к исходному каталогу, содержащему.

Например, для такой структуры папок:

Root---project---Build---{My msbuild project}
           |
           |-Tools---MSBuildCommunityTasks---{Binaries and Targets}
Где:
{Мой проект msbuild} находится в Root \ Project \ Build \
{MSbuildCommunityTasks} находится в Root \ Project \ Tools \ MsBuildCommunityTasks

Чтобы заставить целевой проект ссылаться на свои двоичные файлы через свойство MSBuildCommunityTasksPath, он найдет файл задач следующим образом:

<PropertyGroup>
    <MSBuildCommunityTasksPath>..\MSBuildCommunityTasks\</MSBuildCommunityTasksPath> <!--Relative path back to yourself-->
</PropertyGroup>

Затем вы можете импортировать файл целей с другой относительной ссылкой на файл:

  <Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/>
0 голосов
/ 16 июля 2014

Я просто хотел добавить, поскольку я не могу комментировать (повтор), что для указания пути к вашему конкретному проекту вы можете использовать $ (SolutionDir) для вашей группы свойств, например:

$ (SolutionDir) \ Мой код \ Сообщество \ MSBuild \ CommunityTasks \

Таким образом, он не привязан к конкретному диску и может основываться на расположении проекта относительно структуры каталогов ваших решений.

Также спасибо за ответ выше, это помогло мне в моем проекте с дополнением выше.

0 голосов
/ 17 января 2012

Я новичок в msbuild, если честно, но я только что решил свою проблему с этим. Я превращал одну из целей в ее собственный проект, и он не находил пути для путей сообщества msbuild. Если вы посмотрите на свой оригинальный проект, вы можете найти что-то вроде этого

<PropertyGroup>
    <ExtensionTasksPath>./</ExtensionTasksPath>
    <MSBuildCommunityTasksPath>./</MSBuildCommunityTasksPath>
</PropertyGroup>

<Import Project="MSBuildExtensionPack\MSBuild.ExtensionPack.tasks"/>
<Import Project="MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

Скопируйте этот код в ваш новый проект, и он должен работать.

0 голосов
/ 22 января 2010

Это один ответ:

http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/feb782e3-72ae-4476-9011-617796f217b6

Но это (если я правильно понимаю) кажется нелепым решением. Чтобы получить пути к работе, мне нужно изменить ссылки на проекты import ? Что произойдет, если я захочу сослаться на импортированный проект из третьего проекта в другой папке?!?

...