Сборка проекта MSBuild 2.0 от 3.5 - PullRequest
4 голосов
/ 23 апреля 2009

У меня есть проект VS 2005 / MSBuild 2.0 (назовем его «Проект A»), который я должен хранить в VS 2005 (он использует сторонний конструктор VS 2005). На проект A ссылаются одним из проектов в моем новом решении VS 2008 (мы будем называть их «Проект C» и «Решение B» соответственно.) В идеале, я бы хотел объединить строительство проекта A в создание решения B, и Я считаю, что атрибут «ToolsVersion» является ключевым. Итак, подведем итог, вот что мне нужно сделать:

  1. Запустите сборку решения B либо из командной строки, либо из Visual C # 2008 Express. Очень важно, чтобы он работал через и !
  2. Пусть Проект C инициирует строительство Проекта А.
  3. Копировать выходные данные проекта A (библиотеки классов) в проект C.
  4. Сборка проекта C и оставшихся проектов в решении B.

Вот схема:
MSBuild 3.5 или VS2008 ->
[Решение B (3.5)] ->
[Проект C (3.5)] ->
[Проект A (2.0)] ->
Скопируйте вывод A в C ->
Продолжайте строить решение B

Есть идеи, как мне это настроить? Клипы из рабочих файлов проекта будут очень благодарны! Заранее спасибо!

РЕШЕНИЕ
Вот что нужно было добавить в Project C, чтобы эта работа работала:

<ItemGroup>
   <ProjectToBuild Include="..\ProjectA\ProjectA.csproj" />
</ItemGroup>
<Target Name="BeforeBuild">
   <MSBuild
     Projects="@(ProjectToBuild)"
     Targets="Rebuild" ToolsVersion="2.0">
              <Output
              TaskParameter="TargetOutputs"
              ItemName="AssembliesBuiltByChildProjects" />
   </MSBuild>
   <Copy SourceFiles="@(AssembliesBuiltByChildProjects)"
            DestinationFolder="$(MSBuildProjectDirectory)"
    />
</Target>

Обратите внимание, что существует известная проблема с получением TargetOutputs решения с задачей MSBuild. Это должно было быть исправлено в MSBuild 3.5, но я предполагаю, что атрибут ToolsVersion вызывает его всплытие. Вот почему я ссылаюсь на ProjectA.csproj напрямую, а не на файл решения.

Ответы [ 4 ]

2 голосов
/ 28 апреля 2009
  1. Убедитесь, что проект C является зависимостью от проекта B. (В этом случае нет проекта B, но если это было так, убедитесь.)
  2. Редактировать proj-файл проекта C в текстовом редакторе. Добавьте следующее внизу файла, но перед закрывающим тегом проекта, где a.sln - это решение для проекта A.





    Проекты = "@ (ProjectsToBuild)"
    Targets = "Build" ToolsVersion = "2.0">
    <Выход <бр /> TaskParameter = "TargetOutputs"
    ItemName = "AssembliesBuiltByChildProjects" />

    DestinationFolder = "@ (SolutionDir) \ References"
    />
    1011 *
    *

  3. Создайте папку ссылок в своем решении и убедитесь, что она помечена как папка ссылок для проекта C.

  4. Сборка проекта B.

Я не проверял, но концепция должна работать.

1 голос
/ 28 апреля 2009

Просто формат SLN отличается от VS2008, файлы CSPROJ / VBPROJ "могут" остаться прежними ... Таким образом, в основном вам понадобятся два файла SLN, добавляющие ваши CSPROJs / VBPROJ в оба SLN.

Читайте http://weblogs.asp.net/palermo4/archive/2007/07/30/managing-projects-in-visual-studio-2005-amp-2008.aspx для получения дополнительной информации.

1 голос
/ 28 апреля 2009

Как насчет этого: Отредактируйте proj-файл проекта C, включив в него задачу Exec MSbuild, которая вызывает VS2005 devenv с ключом / build для сборки проекта A, а затем скопируйте выходные файлы из сборки A проекта в место, где можно найти проект C. Вы должны сделать это на этапе сборки в proj-файле проекта C до компиляции проекта C, возможно, до BeforeBuild, чтобы проект C мог найти выходные данные проекта A.

1 голос
/ 26 апреля 2009

Вы не указали конкретную причину, по которой вам нужно использовать Visual Studio 2005 для этого одного проекта. (Я знаю, что для этого есть веские причины, но они могут подразумевать разные решения.)

То, что я однажды успешно выполнил, - это установил пути двоичных файлов, включений и библиотек в VS2008 для использования компилятора и включений vs2005 (это был проект win32 c ++).

Вы можете удалить / nologo из опций компилятора, чтобы фактически увидеть используемую версию компилятора.

МЕТОДИЧЕСКИЕ:

  • Скопируйте и переименуйте проект 2005 года перед его преобразованием в 2008. (чтобы была доступна чистая версия 2005 года)
  • Добавить новый преобразованный проект в решение 2008, установить зависимости.

  • Добавить элемент-страницу-свойств (не знаю, как он называется на английском языке, это файл .vsprops) в версию проекта 2008 года с установленными бинарными, сборочными и включаемыми каталогами к вашей установке 2005 года , что заставляет vs2008 использовать набор инструментов 2005 года для этого проекта. Вам может понадобиться профессиональная версия vs2008 для создания такого файла, но все версии должны быть в состоянии прочитать его)

По сути, для этого проекта вы будете использовать только компонент редактора 2008 года и компилятор 2005 года.

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

...