Здравствуйте, mihhon, Вы писали:
M>Внутри каждого из solutions зависимости между projects.
Строго говоря, внутри sln-файла зависимости между C#-проектами не хранятся. Там по большему счёту вообще ничего особо ценного или невосполнимого нет. Имхо, не стоит трактовать solution'ы как какие-то логические единицы и вообще уделять им слишком много внимания.
M>Возникла необходимость создать один solution, который бы состоял из ~40 projects, внутри которого только project references, т.е. вместо
M><Reference ...>
M>в *.csproj было бы
M><ProjectReference ...>
M>При этом хотелось бы сохранить структуру 2х существующих solutions.
M>Кроме как написать скрипт , который подменяет (1) -> (2) в *.csproj перед тем, как начать работу в новом solution, и (2) -> (1) перед тем, как комитить в svn , не вижу больше вариантов...
Файлы MSBuild-проектов — это уже скрипты сборки, зачем привлекать какие-то сторонние средства скриптования?
M>Может есть какой-то ещё вариант?
Если вкратце — просто использовать условия в PropertyGroup. В зависимости от как-то определённого окружения (тут возможны варианты по вкусу) будет использоваться один или другой кусок. Ну а вообще, нужно взять и изучить наконец свой инструментарий, а не ограничиваться поисками решений частных проблем.
Но стоит учитывать, что при сборке проекта без Студии (скажем, на билд-сервере), свойство $(SolutionName) может быть не определено, его нужно будет задать отдельно ключём:
Возможно, лучше в коде скриптов сборки не ссылаться на свойства $(SolutionDir), $(SolutionName) напрямую, а выразить через них свои свойства и ссылаться только на последние. Будучи заданными через ключи сборки, они переопределяют свои объявления в скриптах.
Здравствуйте, fddima, Вы писали:
F>BeforeBuild в студии будет выполнен в порядке сборки проектов в солюшине. F>А MSBuild xxxx.sln -> выполнит сначала все BeforeBuild-таргеты и затем продолжит собирать все проекты.
Честно говоря, пока не проверю, не стану принимать на веру. Но в любом случае закладываться на подобное поведение нельзя. Проекты надо писать так, чтоб они могли быть собраны без всякой Студии.
. Не подтвердилось.
Q>Но в любом случае закладываться на подобное поведение нельзя. Проекты надо писать так, чтоб они могли быть собраны без всякой Студии.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Eсть 2 solutions s1 s2 , которыми занимаются 2 разные команды, в каждом solution примерно по 30 projects. Внутри каждого из solutions зависимости между projects. Кроме того, между solutions присутствуют взаимные зависимости, примерно по 10 projects из одного solution используются в другом, циклческих зависимостей нет, можно проиллюстрировать такой схемкой.
При этом хотелось бы сохранить структуру 2х существующих solutions.
Один большой solution — не решение, т.к. и так уже тормозит при компиляции и тестах + команда s2 не имеет доступ к исходникам s1
Кроме как написать скрипт , который подменяет (1) -> (2) в *.csproj перед тем, как начать работу в новом solution, и (2) -> (1) перед тем, как комитить в svn , не вижу больше вариантов...
Может есть какой-то ещё вариант ?
17.10.11 16:05: Перенесено модератором из '.NET' — VladD2
Здравствуйте, Qbit86, Вы писали:
M>>Внутри каждого из solutions зависимости между projects. Q>Строго говоря, внутри sln-файла зависимости между C#-проектами не хранятся. Там по большему счёту вообще ничего особо ценного или невосполнимого нет. Имхо, не стоит трактовать solution'ы как какие-то логические единицы и вообще уделять им слишком много внимания.
Строго говоря — да.
Однако следует не забывать, что студия и MSBuild выполняет собирает проекты по разному:
BeforeBuild в студии будет выполнен в порядке сборки проектов в солюшине.
А MSBuild xxxx.sln -> выполнит сначала все BeforeBuild-таргеты и затем продолжит собирать все проекты.
Здравствуйте, Qbit86, Вы писали:
Q>Проекты надо писать так, чтоб они могли быть собраны без всякой Студии.
Это несомненно.
Я и сам билды собираю именно с помощью MSBuild.
Здравствуйте, fddima, Вы писали:
F> Однако следует не забывать, что студия и MSBuild выполняет собирает проекты по разному: F>BeforeBuild в студии будет выполнен в порядке сборки проектов в солюшине.
Открою тебе сикрет. Сборку студия осуществляет через MSBuild (по крайней мере для проектов C#-а). А порядок компиляции проектов определяется зависимостями проектов которые так же вычисляются через MSBuild. Так что если есть какая-то разница, то она скорее определяется разными значениями окружения.
F>А MSBuild xxxx.sln -> выполнит сначала все BeforeBuild-таргеты и затем продолжит собирать все проекты.
Пошел проверил. Создал два C#-проекта. Добавил в них прожет-референс (смысл в этом нет, но для чистоты эксперимента...) Добавил в каждый по строчке:
В дополнение. Это случается только с проектами подключенными через референсы.
Если от 3-го проекта убрать референсы на 2 и 1-ый — но указать ему через Project Build Order, что он завист от 1-го и 2-го -> всё будет чётко следовать указанному порядку вне зависимости от maxcpucount.
Здравствуйте, fddima, Вы писали:
F>Мда. Я запускаю MSBuild с ключём /m (maxcpucount), веря в то что и студия тоже так делает, — в ней указано максимум 2 проекта билдить параллельно.
Ну, дык — это, как раз, можно и исправить.
Но, согласен, знать (и помнить) об этом надо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Q>по большему счёту вообще ничего особо ценного или невосполнимого нет.
удобно загрузить все проекты одним кликом, в дебаггере всё видно без указания где исходники и т.п.
Q>Файлы MSBuild-проектов — это уже скрипты сборки, зачем привлекать какие-то сторонние средства скриптования?
Здравствуйте, VladD2, Вы писали:
F>>Мда. Я запускаю MSBuild с ключём /m (maxcpucount), веря в то что и студия тоже так делает, — в ней указано максимум 2 проекта билдить параллельно. VD>Ну, дык — это, как раз, можно и исправить. VD>Но, согласен, знать (и помнить) об этом надо.
Да я вот получается, что не знал, и было время когда изрядно помучался из-за этого, пока понял в чём дело...
Забавно, но студия C++ проекты у меня билдит в два процесса аж бегом (т.е. по два cl / link), хотя конечно это не тоже самое.
Q>Но стоит учитывать, что при сборке проекта без Студии (скажем, на билд-сервере), свойство $(SolutionName) может быть не определено, его нужно будет задать отдельно ключём: Q>
Q>Возможно, лучше в коде скриптов сборки не ссылаться на свойства $(SolutionDir), $(SolutionName) напрямую, а выразить через них свои свойства и ссылаться только на последние. Будучи заданными через ключи сборки, они переопределяют свои объявления в скриптах.