У кого-нибудь есть опыт вызова Rake из MSBuild для получения кода gen и других преимуществ? Как прошло? Каковы ваши мысли / рекомендации? - PullRequest
5 голосов
/ 24 марта 2009

При программировании на C # с использованием Visual Studio 2008 я часто желаю «автоматической» генерации кода. Если это возможно, я бы хотел добиться этого, вызвав мой файл решения MSBuild для Rake, который вызвал бы код Ruby для генерации кода, чтобы полученные сгенерированные файлы автоматически появлялись в моем решении.

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

public interface IQuarterlyResults
{
     double TotalRevenue { get; set; }
     double NetProfit { get; set; }
}

public interface IConsumerQuarterlyResults
{
     double ConsumerTotalRevenue { get; set; }
     double ConsumerNetProfit { get; set; }
}

public interface ICorporateQuarterResults
{
     double CorporateTotalRevenue { get; set; }
     double CorporateNetProfit { get; set; }
}

В этом примере есть «Потребительская бизнес-единица» и «Корпоративная бизнес-единица». Каждое свойство в IQuarterlyResults становится свойством «Corporate» + [имя свойства] в ICorporateQuarterlyResults, а также для IConsumerQuarterlyResults.

Зачем создавать интерфейсы для них, а не просто иметь экземпляр IQuarterlyResults для потребителя и другой экземпляр для корпоративного? Потому что при работе с объектом калькулятора, который я строил, пользователю приходилось иметь дело с сотнями свойств, и это намного менее сбивает с толку, если он может иметь дело с «полностью определенными» именами свойств, такими как «ConsumerNetProfit».

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

Основной вопрос таков: Мне нравится использовать Ruby и ERB для генерации кода, и мне нравится использовать Rake для управления зависимостями между задачами. Чтобы решить вышеупомянутую проблему, я хотел бы, чтобы MSBuild вызвал Rake, и чтобы Rake / Ruby прочитал список свойств на «базовом» интерфейсе, а затем сгенерировал код для создания всех зависимых интерфейсов и их свойства. Это срабатывает каждый раз, когда я выполняю сборку, потому что я помещаю ее в файл MSBuild для решения VS.NET.

Кто-нибудь пробовал что-нибудь подобное? Как это сработало для вас? Что вы можете рассказать о плюсах, минусах, советах для достижения успеха и т. Д.?

Спасибо!

Ответы [ 3 ]

1 голос
/ 03 апреля 2010

Я использую rake для генерации файлов конфигурации, которые созданы с использованием ERB. Нужно отредактировать файл проекта, чтобы вставить объект BeforeBuild, который вызывает rake, как:

<Target Name="BeforeBuild">
     <Exec Command="rake name_of_my_template_processing_task" />
</Target>

См. msbuild exec docs и сообщение в блоге о событиях до сборки . Вам необходимо в атрибуте Command:

  • укажите путь к рейку, если он уже не находится в переменной окружения пути
  • установить атрибут рабочего каталога, если он необходим для запуска из определенного каталога
  • укажите аргумент -r и путь к rakefile, если вы не выполняете rake из каталога, в котором находится ваш проект.
1 голос
/ 24 марта 2009

Мы сделали это с Nant / ruby ​​+ ERB - он генерирует тон CRUD в нашем DAL и форме ввода данных для нашего веб-приложения. для нас это работает очень хорошо, но в начале было достаточно времени на настройку, которое заставило моего босса / клиента нервничать, потому что они решили, что мы должны показать больше продукции, чем прототипа.

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

Ruby / erb не выполняется быстро. Метод, позволяющий определить, когда вам нужно / не нужно генерировать, полезен, потому что циклы компиляции начинают становиться длинными и непродуктивными. Мы также сочли полезным всегда создавать небольшой тестовый набор для генерации хотя бы одного набора артефактов, прежде чем интегрировать его в рабочий процесс - у вас есть тест продукта, и он никого не замедляет, пока вы работаете с элементом (ами) cg. ).

Я бы прочитал Джек Херрингтонс Генерация кода в действии , поскольку он ориентирован на Рубин. Это привело меня в CG.

Я также хотел бы получить Кэтлин Доллардс Генерация кода в Microsoft .NET . Он построен для использования XSLT, но принципы одинаковы для разработки метаданных, этапов преобразования и интеграции. Ее статьи также полезны в журналах и в Интернете.

0 голосов
/ 03 апреля 2009

Я хотел просто добавить это (хотя я сомневаюсь, что это будет ответом на вопрос, это должна быть информация), но есть пара хороших инструментов CodeGen, которые имеют довольно сильную интеграцию Visual Studio, которая может делай то, что хочешь. Очевидно, вы ищете инструмент Ruby, но для тех, кто не знаком с Ruby, рассмотрите некоторые другие инструменты:

...