2010-01-22 1 views
9

Прошу прощаться, я новичок в msbuild и msbuildtasks!Как импортировать проект msbuildcommunitytasks из другого проекта msbuild с относительным пути к файлу?

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

Эффективно Я пытаюсь работать по documented behaviour импортных проектов:

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

+0

Есть ли конкретная причина, по которой вы не ставите MSBuildCommunityTask lib бок о бок с MSBuild в% PROGDIR% \ MSBuild \ MSBuildCommunityTasks \? Затем путь может быть относительно MSBuild (например, предложенный людьми MSBCT): Filburt

+2

Да, потому что тогда мне нужно будет установить его на все устройства dev/build, а затем должны управлять их обновлением. –

ответ

5

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

Например, если структура папок, как это:

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

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

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

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

<Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/> 
15

Был аналогичный вопрос: Is it possible to use MSBuild Extension Pack without installation?. Этот вопрос заключался в том, как сделать то же самое с 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> 
+0

Но это абсолютные пути к файлу нет? Или я не понимаю? Мне нужно ссылаться на него с относительным пути к файлу или, по крайней мере, иметь возможность конвертировать относительный путь к файлу во время выполнения. –

+0

Для большинства инструментов требуется полный путь для правильной работы. Я создал пару переменных в .proj, которые я ввел во все мои «рабочие» .proj-файлы.Эти переменные содержат фиксированную часть путей для разных вещей. В группе свойств: $ (WorkDrive) $ (SolutionFolder) \ $ (Branch) \ NET \ BuildOut $ (Конфигурация) $ (SolutionFolder) построен из других вещей, таких как Major -Minor build number и т. Д. (Специфично для нашей настройки) Затем другие .proj-файлы импортируют его: DaveE

+3

Вы должны иметь возможность построить полный путь из относительного пути. Вы можете использовать такие свойства, как MSBuildProjectDirectory. –

0

Это, кажется, один ответ:

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

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

6

@Sayed Ибрагим Хашими

Талкин о MSBuild4 Просто объявляя MSBuildCommunityTasksLib обыкновение хватать причину, если и проверить MSBuild .Community.Tasks.Targets file объявлены как следующие:

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

Итак, если U только переместится на MSBuildCommunityTasksLib, он снова перейдет в файл MSBuild.Community.Tasks.Targets, поскольку он не является условным . Так что у вас есть возможность перекрыть MSBuildCommunityTasksPath, чтобы его проприетство не было установлено из MSBuildExtensionsPath, а из ur пользовательский путь. Correst me if I m wrong

0

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

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

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

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

+0

Это не сработает. Ваши переменные даже не экранируются с помощью $(). Пример: Alkaline

0

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

$ (SolutionDir) \ My Code \ Community \ MSBuild \ CommunityTasks \

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^