Как создать общий репозиторий MSBuild .proj файлов? - PullRequest
2 голосов
/ 09 августа 2009

С тех пор, как я начал использовать MSBuild для наших проектов, я создал несколько скриптов .proj, которые используются несколькими проектами в нашем репозитории. Все эти общие сценарии находятся в одном каталоге.

До сих пор я обращался к общим сценариям, используя относительный путь, что-то вроде этого:

<MSBuild Projects="..\..\common\build\MyScriptA.proj" Properties="ABC=XYZ"/>

Однако каждый проект также импортирует общий скрипт .proj, например:

<Import Project="..\..\common\build\CommonImports.proj"/>

, который <Import> описывает несколько других вещей и определяет некоторые свойства.

Этим утром я подумал, что смогу заменить относительный путь переменной, возможно, $(CommonDir), которая будет определена путем импорта CommonImports.proj, упомянутого выше. Это позволило бы мне вызвать общие задачи, такие как:

<MSBuild Projects="$(CommonDir)\MyScriptA.proj" Properties="ABC=XYZ"/>

Однако я не могу найти способ определить эту переменную $(CommonDir) так, чтобы она работала во всех других сценариях MSBuild, которые импортируют CommonImports.proj, независимо от их местоположения.

Этот вопрос предлагает несколько способов создания свойства, содержащего абсолютный путь из относительного пути, но ни один из них, похоже, не работает, если все, что я делаю, - это <Import> скрипт, определяющий свойство.

Вопрос 1 : Я довольно новичок в MSBuild; Есть ли лучший способ создать «библиотеку» повторно используемых скриптов .proj, которую я мог бы запустить с помощью задачи <MSBuild>? Мне известно о $(MSBuildExtensionsPath), однако я хотел бы, чтобы общие задачи находились в моей кассе, чтобы наша сборочная машина автоматически получала последние версии общих задач всякий раз, когда она выполняет проверку.

Вопрос 2 : Как определить $(CommonDir) внутри CommonImports.proj, чтобы он содержал абсолютный путь к каталогу, содержащему CommonImports.proj?

Ответы [ 3 ]

2 голосов
/ 24 августа 2009

Интересно, не стоит ли указывать его в пути MSBuild:

Например, этот проект потребляется через:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

и устанавливает себя в:

{program files}\MSBuild\MSBuildCommunityTasks

Так, возможно, определите свою собственную конкретную подпапку и используйте ее оттуда?

<Import Project="$(MSBuildExtensionsPath)\romkyns\CommonImports.proj"/>

и т.д.. Поскольку переменная $MSBuildExtensionsPath определяется отдельно, у вас не должно быть таких сложностей. Может быть.

1 голос
/ 18 июля 2011

Это не подробный ответ, но вот некоторые заметки, которые обычно очень полезны, когда люди решают эту проблему. Все требуют MSBuild 4.0 или более поздней версии.

(1) Свойство $ (MSBuildThisFile) и аналогичные свойства. Это позволяет импортированным файлам ссылаться на файлы, относящиеся к самим себе, а не к проекту, в который они импортированы. Это отсоединяет их от проекта, в который они импортированы.

(2) Функция «GetDirectoryNameOfFileAbove». Смотрите здесь . Эта удивительно полезная функция позволяет проектам импортировать файлы, местоположение которых они не знают. Поместите общие файлы (или один единственный совместный файл-заглушку, который импортирует остальные откуда-то) в верхнюю часть вашего исходного дерева. Затем используйте эту функцию в проектах под ней, чтобы найти эту заглушку и импортировать ее, и, следовательно, весь процесс совместной сборки.

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

1 голос
/ 01 февраля 2011

Вот что лучше всего сработало для нас.

Сначала проверьте все повторно используемые материалы в каталоге /common/build/ в VCS.

Затем добавьте /common/build/CommonImports.proj, выглядя примерно так:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         ToolsVersion="4.0">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
  <Import Project="ILMerge.proj"/>
  <Import Project="Mage.proj"/>
  <Import Project="InnoSetup.proj"/>
  <UsingTask TaskName="RT.Tasks.AssemblyVersion" AssemblyFile="Tasks\Release\RT.Tasks.dll"/>
  <UsingTask TaskName="RT.Tasks.WaitForProcessesToTerminate" AssemblyFile="Tasks\Release\RT.Tasks.dll"/>
  <PropertyGroup>
    <BuildSingleProj>$(Root)\common\build\BuildSingle.proj</BuildSingleProj>
  </PropertyGroup>
</Project>

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

<PropertyGroup>
  <Root>..\..</Root>
  [... other global properties ...]
</PropertyGroup>
<Import Project="$(Root)\common\build\CommonImports.proj"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...