metaclass: (Default)
[personal profile] metaclass
А давайте я вам расскажу, откуда берутся ебанутые требования к разработчикам и вообще черви и жабы в ИТ. На примере одного простейшего use-case.
Есть, значит, проект на дотнете. Как положено, его исходники лежат под контролем версий (меркуриал). И я, всего лишь, желаю следующего:
1) Проект собирается на машине, где стоит только вижуал студия (а в идеале - только .NET фреймворк)
2) При сборке получающиеся либы имеют версию вида major.minor.номер-релиза.vcsrevision. Т.е. проставить версии исходя из номера ревизии в меркуриале.
Вполне себе нормальное желание - пришел к клиенту, глянул на свойства файла и видишь что за версия, итд.

Так вот, реализация этого дела с уверенностью заводит в один из следующих тупиков:
1) cmd-файлы, вызывающие комманд-лайн меркуриал и генерирующие файлы AssemblyInfo.cs. При дальнейшем развитии получается фреймворк для билда из cmd-файлов, безальтернативно. Ад кромешнейший.
2) вижуал студия с доставленными 100500 расширениями выполняющими именно это, но каждое из которых не умеет чего-нибудь.
3) NAnt с 100500 вручную написанными скриптами сборки, которые нужно синхронизировать с csproj
4) NAnt, который вызывает MSBuild для сборки, т.к. csproj - это на самом деле скрипты MSBuild
5) то, что я пытался сейчас сделать: только MSBuild. Из соображений "не разводить зоопарк". Ага, да.

Значит последовательность действий с MSBuild:
1) Ищем интеграцию MSBuild с меркуриалом, в гугле. Находим: http://msbuildhg.codeplex.com/
2) Качаем. MSBuild.Mercurial-1.1.2.msi. Хер знает что и куда это ставит, поэтому ставим в виртуальной машине. Смотрим, что реально это два файлика MSBuild.Mercurial.dll, MSBuild.Mercurial.tasks и примеры с документацией.
3) Начинаем разбираться в примере, как установить версию. 125 строк, 4 кб xml-файл HgVersion.targets.
4) Файл зависит от MSBuild Community Tasks. Оттуда используется _ОДНО_ описание таска - AssemblyInfo, которое используется для генерации файла AssemblyInfo
5) Ищем MSBuild Community Tasks в гугле: http://msbuildtasks.tigris.org/. Оказывается, проект переехал на гитхаб: https://github.com/loresoft/msbuildtasks
6) Идем туда. Оказывается, чтобы поставить - нужен Package Manager Console. Являющийся частью NuGet. Скачать просто dll и tasks - нельзя.
7) Думаю - попытаюсь собрать самостоятельно. Качаю исходники, распаковываю, запускаю:
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe Master.proj
Хрен там. Для сборки ТОЖЕ нужен NuGet: loresoft-msbuildtasks-37dae23\Source\.nuget\nuget.targets(51,9): error : Unable to locate ', ".nuget"))\nuget.exe'

На этом я заябываюсь и иду писать пост в ЖЖ. При этом самодельная реализация того же на бат-файлах - 3 строки бат файла и 10 строк утилитка на дотнете(которую можно заменить awk из GNUWin32, по идее).

Короче, я не знаю, какие сделать из этого выводы. Наверно, проще в корне сборочных скриптов положить файл readme.txt и написать, в какой последовательности что исправлять и что должно стоять на машине, чтобы собрать проекты, потому что попытка сделать "как положено" (системы сборки, общепринятые инструменты) уводит в дебри с первого же шага.
(deleted comment)

Date: 2012-05-17 12:38 pm (UTC)
From: [identity profile] metaclass.livejournal.com
В каком плане?
Обычная задача (версионирование из VCS), обычные граничные условия (чистая сборка, минимум зависимостей, минимизация использования различных скриптовых языков).
Результат: с большой вероятностью ебаный ад. С причинами пока не разобрался.

Date: 2012-05-17 01:15 pm (UTC)
From: [identity profile] eternal-leave.livejournal.com
Вот результат и запущен :)

Date: 2012-05-17 12:37 pm (UTC)
From: [identity profile] craneop.livejournal.com
После этого пишут что в жабе ад. Ну ну.

Date: 2012-05-17 12:47 pm (UTC)
From: [identity profile] metaclass.livejournal.com
В жабе попроще - мавен общепринят. Т.е. тот же ад, но уже подготовленный к использованию.

Date: 2012-05-17 12:49 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Написать утилитку на дотнетах, скомпилировать, положить в VCS, запускать как post-build task.

Date: 2012-05-17 12:58 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Именно так, видимо и надо сделать, только pre-build task

Date: 2012-05-17 01:05 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Ага. А ревизию и тупо запустив hg можно вытащить.

Я тоже как-то занимался MSBuild-ом и CCNet-ом. В принципе оно все так и делается, главный паттерн - все что нужно сваливать прям в VSC (включая бинарники утилит, все нужные сборки, конфиги CCNet-ов и т.п.). Вроде жить можно.

Date: 2012-05-17 02:01 pm (UTC)
From: [identity profile] antilamer.livejournal.com
Мы, кажется, так и делали.

Date: 2012-05-18 06:57 am (UTC)
From: [identity profile] smalgin.livejournal.com
just for lulz

powershell script? :)
(deleted comment)

Date: 2012-05-17 06:37 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Запуск студии вместо msbuild:
- не даст никакой разницы в том что происходит (т.к. msbuild понимает .sln, а csproj - это родной ее формат)
- может быть в разы медленнее (т.к. надо загружать эту слонятину)

Date: 2012-05-17 12:58 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Вообще решительно неясно почему рядом к csc в .net не положили runcs.exe с понятным назначением. Можно еще оборачивать все эти using/namespace/class/main чтобы букв писать поменьше.

Был бы на 90% тачек нормальный язык для всякого скриптования. На C#, как по мне, всякие "считай-запиши текст/xml" делаются весьма неплохо. Плюс, в отличии от awk и прочих bat-файлов оно нормально потом усложняется при необходимости.

Date: 2012-05-17 01:02 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Да, C# вполне приемлемо для таких целей.
Там в принципе, иерархии задач типа как в make, не особо опишешь, но мелкие императивные задачи вполне нормально решать.

Date: 2012-05-17 01:47 pm (UTC)
From: [identity profile] n16bs.livejournal.com
Есть же PowerShell в котором в каком-то виде можно юзать дотнет. Правда подозреваю, что реализовано это ужасно, но он есть.

Date: 2012-05-17 01:56 pm (UTC)
From: [identity profile] jakobz.livejournal.com
PowerShell - это еще один язык, причем весьма извращенный. Если еще бы его ставить не надо было отдельно - можно было бы и попробовать. А так - не вижу смысла.

Date: 2012-05-17 01:34 pm (UTC)
From: [identity profile] n16bs.livejournal.com
А как насчёт написать свой таск для MSBuild'a который сделает всё что нужно?

Date: 2012-05-17 01:48 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Можно попробовать. Опасаюсь, что в итоге я окажусь где-нибудь в дебрях апи msbuild где ад заборы и коровники)

Date: 2012-05-17 01:51 pm (UTC)
From: [identity profile] n16bs.livejournal.com
Ну мы задачу "скормить cli тулзе сборки после билда" решили так. Там всё просто:

public class MyTask : Task
{
[Required] public string Param1 { get; set; } // параметр из билдскрипта

public override bool Execute()
{
// кормим жаб
}
}

Edited Date: 2012-05-17 01:52 pm (UTC)

Date: 2012-05-17 09:18 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Все, так и сделал. Таск запускает меркуриал и генерирует нужные файлы исходя из его показаний.
MSBuild ведет себя как положено, деплоймент результата его же средствами, пока все ок.

Date: 2012-05-17 02:06 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Чорт, удалил полезный комент от анонимуса
"Любовь некоторых людей к кактусам иногда поражает всякое воображение. Ведь стоит один раз признать очевидную вещь, - сиришотка не язык, а венда не операционка, - и всё становится просто, ясно и красиво, но нет, мыши будут плакать и колоться."

Так вот, что я хотел сказать: оно так и есть, но блин, клиенты хотят винду и C#.

Date: 2012-05-17 06:50 pm (UTC)
From: [identity profile] jakobz.livejournal.com
C# - нормальный язык. Я вообще думаю что он, с прагматической точки зрения - один из лучших на данный момент. Ява вообще сосет вприсядку. Динамические языки динамические. А остальное все может и хорошо, но весьма маргинально.

В .net другое посасывает, с языком все ок.

Date: 2012-05-17 09:16 pm (UTC)
From: [identity profile] victor bolshakov (from livejournal.com)
.NET хорош тем, что изначально к языку не привязан.

Date: 2012-05-19 10:31 am (UTC)
From: [identity profile] si14.livejournal.com
Разрешите поинтересоваться — что не так с динамическими языками? Не говнопитоном, а чем-нибудь более нормальным вроде кложури или эрланга.

Date: 2012-05-19 09:44 pm (UTC)
From: [identity profile] jakobz.livejournal.com
С прагматической точки зрения: нельзя приделать корректный автокомплит. Ну т.е. приходит человек с института, нажимает ctrl+space, и он все уже знает и все умеет.

С романтической точки зрения, наука говорит что динамические языки - от бедности.

Date: 2012-05-17 09:01 pm (UTC)
From: (Anonymous)
> клиенты хотят винду и C#.
Сочувствую.

Date: 2012-05-17 09:17 pm (UTC)
From: [identity profile] victor bolshakov (from livejournal.com)
клиенты платят деньги.

Date: 2012-05-17 10:22 pm (UTC)
From: [identity profile] alexandr0.livejournal.com
Клиенты, которые не хотят винду и дотнет, по-вашему, не платят?

Date: 2012-05-17 02:06 pm (UTC)
From: [identity profile] blueher.livejournal.com
> Так вот, реализация этого дела с уверенностью заводит в один из следующих тупиков:
1) cmd-файлы, вызывающие комманд-лайн меркуриал и генерирующие файлы AssemblyInfo.cs. При дальнейшем развитии получается фреймворк для билда из cmd-файлов, безальтернативно. Ад кромешнейший.
2) вижуал студия с доставленными 100500 расширениями выполняющими именно это, но каждое из которых не умеет чего-нибудь.
3) NAnt с 100500 вручную написанными скриптами сборки, которые нужно синхронизировать с csproj
4) NAnt, который вызывает MSBuild для сборки, т.к. csproj - это на самом деле скрипты MSBuild
5) то, что я пытался сейчас сделать: только MSBuild. Из соображений "не разводить зоопарк". Ага, да.

я в таких случаях давно и безнадёжно агитирую за JavaScript в ипостаси WSH. Есть на всех виндах включая забытые Богом 95-е, умеет дёргать почти все COM-компоненты, запускать exe-ники и прочая, прочая. При этом - читается куда легче чем все эти CMD. Ну и из всех билд-систем отлично запускается как внешний процесс (если в билд надо вклиниться посредине). При небольшой сноровке весьма удобно. А если захотеть странного - так на нём можно ещё и UI писать, в виде MS HTA. Короче, эдакий некросплатформенный питон.

Date: 2012-05-17 02:10 pm (UTC)
From: [identity profile] blueher.livejournal.com
Забыл добавить важную вещь - в отличие от CMD эту штуку можно отлаживать. Не слишком интересный фичер для мелких скриптов, но мы ж знаем как быстро растут чужие дети маленькие скрипты...

Date: 2012-05-17 06:52 pm (UTC)
From: [identity profile] jakobz.livejournal.com
Херасе. Пару вопросиков можно?
- насколько совместим с браузерным яваскриптом?
- как дергать, какой командой?

Date: 2012-05-17 09:37 pm (UTC)
From: [identity profile] shredder-by.livejournal.com
wscript блаблабла.js

Date: 2012-05-18 08:48 am (UTC)
From: [identity profile] blueher.livejournal.com
> - насколько совместим с браузерным яваскриптом?
Вплоть до IE9 (а может и в нём тоже, просто они там чего-то наменяли а у меня ещё не дошли руки смотреть) реализация собственно языка JavaScript одна и та же что в IE что в WSH (используется одна и та же jscript.dll). Но естессно что DOM-овских обьектов (document и т.п.) в нём нет, зато есть глобальный обьект WScript который и позволяет дёргать всё что угодно в системе.

> - как дергать, какой командой?
cscript.exe <имяфайла>

Date: 2012-05-17 04:49 pm (UTC)
From: [identity profile] alant.livejournal.com
У нас этим занимается другое червие - TeamCity. В нём придумали спец таск, шоп патчить AssemblyInfo.cs. Как оказалось, решение не без проблем, т.к. в WCF до .NET 4.0 надо указывать strong name и звёздочки в версии сборки не прокатывают

Date: 2012-05-17 04:53 pm (UTC)
From: [identity profile] alant.livejournal.com
Уточнение

> в WCF до .NET 4.0 надо указывать strong name
это касалось extensions и custom behavior, которые лежали в отдельной длл

Date: 2012-05-17 04:55 pm (UTC)
From: [identity profile] pascendi.livejournal.com
Мыши плакали, кололись, но продолжали е..ть кактус.

Майкрософт такой майкрософт...

Date: 2012-05-17 09:19 pm (UTC)
From: [identity profile] victor bolshakov (from livejournal.com)
Дело не в микрософте. Просто хочется максимально вылизать билдпроцесс.

Date: 2012-05-17 07:35 pm (UTC)
From: [identity profile] darkdrip.livejournal.com
эта, CS-Script совсем не подходит?
(deleted comment)

Date: 2012-05-17 09:19 pm (UTC)
From: [identity profile] victor bolshakov (from livejournal.com)
Руками писать дилдскрипт для большого проекта это удавицца просто.

Date: 2012-05-17 09:29 pm (UTC)
From: [identity profile] metaclass.livejournal.com
И таки да, это самый настоящий ДилдСкрипт.

Date: 2012-05-17 08:27 pm (UTC)
From: [identity profile] guamoka.livejournal.com
Билд скрипты меня вообще пугают. С тех пор как перешел на жабу, порой создаётся впечатление, что проект только и состоит из них, а что там делает само приложение- уже не важно.

Date: 2012-05-17 09:15 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Да.
Впрочем, я их победил таки - исключил наиболее дебильные варианты (cmd-файлы, ручные утилиты) - оставил msbuild и кастомное расширение к нему тут же в репозитории. Все работает, как перфекционизм предписывает.

Date: 2012-05-17 09:26 pm (UTC)
From: [identity profile] bydl0coder.livejournal.com
Пост-коммит хук?

Date: 2012-05-17 09:31 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Под виндами не работоспособны)

Date: 2012-05-18 04:47 pm (UTC)
From: [identity profile] black-angel-by.livejournal.com
Ребе, напишите уже ебилд на свой проект :)

Date: 2012-05-19 10:33 am (UTC)
From: [identity profile] si14.livejournal.com
Да уж. Как же я доволен после этого экосистемой эрланга: git pull && rebar get-deps compile && ./start-dev.sh

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 4th, 2025 05:45 am
Powered by Dreamwidth Studios