- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
<macrodef name="foreach">
<attribute name="target"/>
<attribute name="file-property"/>
<element name="files"/>
<element name="args"/>
<sequential>
<local name="foreach.files"/>
<local name="foreach.target"/>
<local name="foreach.file-property"/>
<local name="foreach.args"/>
<property name="foreach.target" value="@{target}"/>
<property name="foreach.file-property" value="@{file-property}"/>
<pathconvert property="foreach.files">
<files/>
</pathconvert>
<propertyset id="foreach.args">
<args/>
</propertyset>
<property name="foreach.args" refid="foreach.args"/>
<property name="foreach.target" value="@{target}"/>
<!-- there is no better way to do this at the moment
property names and values should not contain comma-space and equals signs
-->
<script language="javascript"><![CDATA[
var files = project.getProperty("foreach.files").split(":"),
args = project.getProperty("foreach.args").split(", "),
task = project.createTask("antcall"), arg;
task.target = project.getProperty("foreach.target");
for (var a in args) {
arg = task.createParam();
arg.setName(a.split("=")[0]);
arg.setValue(String(a.split("=")[1]));
}
for (var f in files) {
arg = task.createParam();
arg.setName(project.getProperty("foreach.file-property"));
arg.setValue(String(files[f]));
task.perform();
}
]]></script>
</sequential>
</macrodef>
<!-- пример использования: -->
<target name="transcode-font-helper">
<property name="font.face.local" value="${font.face}"/>
<foreach target="transcode-font" file-property="font.raw.source">
<files>
<fileset dir="${basedir}/fonts">
<include name="*/${font.face.local}/*.otf"/>
<include name="*/${font.face.local}/*.ttf"/>
</fileset>
</files>
<args>
<propertyref name="font.face.local"/>
</args>
</foreach>
</target>
А ведь если подумать: собрали все самое лучше, что есть в современном программировании - Ява, ХМЛ и ж.скрипт. Потом выбросили условные операторы, итерацию и операции со строкам - потому что не нужны. И получилась замечательная система для сборки проектов.
Dummy00001 06.01.2015 16:57 # +1
мы уже про это говорили здесь.
потому что программисты думают только про программирование, и забывают про остальные фазы разработки (deployment, support). иногда даже про то что разница между release и debug может быть больше чем пара флагов компиляции.
поэтому почти у всех модерновых билд систем база такая слабая. просто тупо скопировать пачку файлов из одного места в другое часто становится неподъёмной проблемой. зато для компиляции вообще ничего писать не надо!!! магия.
wvxvw 06.01.2015 17:47 # 0
Но это такая пытка это все расписывать. Плюс потом все равно очень легко ошибиться где чей ключ.
Dummy00001 06.01.2015 17:49 # 0
wvxvw 06.01.2015 17:56 # 0
Dummy00001 06.01.2015 17:56 # 0
wvxvw 06.01.2015 18:06 # 0
roman-kashitsyn 06.01.2015 18:18 # +3
guest 06.01.2015 21:02 # 0
wvxvw 06.01.2015 21:18 # 0
На сегодняшний день использование адобовского таска составляет доли процента от всей сборки, но чем дальше, тем сложнее это все поменять.
roman-kashitsyn 06.01.2015 21:42 # 0
wvxvw 06.01.2015 21:53 # 0
Не то, чтобы у них сейчас это хорошо получалось, но за полгода маленький прогресс все-таки есть. Переключиться на что-то другое: это мне обеспечит еще много ненависти и войны с ветряными мельницами...
roman-kashitsyn 06.01.2015 22:19 # +1
Сам не так давно переписал довольно большой билд с анта на градл, доволен как слон. Напрягает только небыстрый запуск сборки.
Из плюсов - проекты для ИДЕ не нужно хранить в репе, нормальные ИДЕ могут генерить проекты прямо из gradle-файлов.
Драться ни с кем не пришлось, благо, работаю с очень умными и приятными людьми.
Dummy00001 07.01.2015 15:01 # 0
> это мне обеспечит еще много ненависти и войны с ветряными мельницами...
обязанность != ответственность.
возьми на себя *ответственность* что если они будут следовать твоим рекомендациям, то все будет работать. а если не будет работать - то ты пофиксишь. в конце концов, ты не можешь отвечать за то как у них это будет работать, если они не хотят твоим рекомендациям следовать.
другими словами, my way - or highway. только сформулировать надо помягче, что бы народ понял что не все на них висеть будет, но и ты какую-то часть ответственности перенимаешь.
по моему опыту, если клиент тебя уже знает, то им даже и проще ответственность на кого-то другого свалить. да, козёл отпущения, но такова селяви.
wvxvw 07.01.2015 15:59 # 0
Опять оказалось, что тривиальный скрипт на Питоне лучше и проще.
wvxvw 07.01.2015 16:59 # 0
Dummy00001 07.01.2015 17:09 # 0
wvxvw 07.01.2015 17:18 # 0
roman-kashitsyn 07.01.2015 18:07 # 0
wvxvw 07.01.2015 19:48 # 0
Судя по стек трейсам, все программы написаные на Яве до 2014 годе участвовали в запуске этого кода, но все равно, ни одна из них не взяла на себя труд бросить исключение, (да что там бросить исключение, просто скопировать сообщение об ошибке в строку!). И вы на полном серьезе считаете это достижением инжинерной мысли?
bormand 07.01.2015 19:49 # 0
Объясняется двумя словами: лень переписывать.
wvxvw 07.01.2015 20:41 # 0
bormand 07.01.2015 20:55 # 0
http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html
wvxvw 07.01.2015 21:03 # 0
Этот аргументы передает корректно, некорректно - встроенный Груви тип строг ГСтринг (Г уже должно было насторожить в названии... но думал по-английски может прокатит). "ls ${someDirectory}".execute() - если в someDirectory будут пробелы, амперсанды и т.п. То мы получим шелл-иньекцию, или хз. как это назвать.
bormand 07.01.2015 21:08 # 0
http://stackoverflow.com/questions/786160/groovy-execute-with-parameters-containing-spaces
P.S. Какое-то ебанутое использование ООП, имхо. Какого хуя список и строка умеют запускать проги?!
wvxvw 07.01.2015 21:44 # 0
wvxvw 08.01.2015 11:40 # 0
wvxvw 08.01.2015 13:00 # 0
Но что показательно, вот обычно читаешь документацию к библиотеке, и если людям хотелось попиарится, то могут туда бенчмарк вставить, или там цитату известного человека. Читаешь документацию Яваговна - что ни слово, то more powerful, more readable, more expressive и прочая ПР-хуйня вместо полезной информации.
bormand 08.01.2015 13:08 # 0
Из документации Cisco.
bormand 08.01.2015 13:09 # 0
Т.е. там нельзя делать свои сканеры зависимостей?
Насчет динамического вывода трабла есть - если система не знает имя выходного файла заранее, то она тупо не сможет трекать зависимости. Или я туплю? Вроде бы все эти системы работают по принципу выход-старше-входа-надо-пересобрать?
bormand 08.01.2015 13:23 # 0
А что, если эти 50 тасков сгенерить циклом (как в http://govnokod.ru/17414#comment260826, только вместо exec запиливаем таски)? Тогда кеш должен заработать (но сканить каталог со входными файлами, походу, будет каждый раз, а как иначе, ведь они могли появиться/исчезнуть)...
http://www.gradle.org/docs/current/userguide/tutorial_using_tasks.html#N1029F
wvxvw 08.01.2015 13:38 # 0
Ну в итоге я так и сделал. Жопа в том, что если мне такой же таск понадобится в другом месте для аналогичной задачи, то решение - только копипаста.
В идеале (и СКонс это умеет), можно было бы научить таск, что если он применяется к каждому файлу в отдельности, а не ко всем вместе, то и при изменении нужно только применять к изменившимся.
http://forums.gradle.org/gradle/topics/equivalent_for_ants_dirset
Эти люди очевидно про работу с файлами слышали только по телевизору.
bormand 08.01.2015 13:40 # 0
Я сейчас вот это читать начал, вроде бы как раз то что надо: The other type of task is the enhanced task, where the behaviour is built into the task, and the task provides some properties which you can use to configure the behaviour.
https://gradle.org/docs/current/userguide/custom_tasks.html
bormand 08.01.2015 14:48 # 0
И про динамическое создание тасков, походу, тоже. Нету метода, генерящего уникальные айдишки для подобных тасков.
wvxvw 08.01.2015 18:13 # 0
bormand 08.01.2015 18:32 # 0
Да там забавно... Если таск не кинул исключение - значит он выполнен. И похуй, что он описанные в outputs.files файлы не создал. Градл эту ситуацию всё равно закеширует. И больше этот таск никогда не запустится пока не изменится что-то в input'ах. После мейка непривычно, но логика в этом есть.
> Нет никакой возможности сделать чистый билд
Есть: --rerun-tasks заставляет его игнорить кеш. Ну или gradle clean сделай, если такой таск описан.
wvxvw 08.01.2015 19:22 # 0
wvxvw 07.01.2015 19:54 # 0
А это хз... вобщем, я конечно еще попытаюсь дочитать маны и посмотреть на проекты побольше, но пока что цель этого мне не понятна. Это настолько несущественно улучшает Ант, что помоему нет смысла.
guest 09.01.2015 01:34 # 0
wvxvw 09.01.2015 09:29 # 0
roman-kashitsyn 09.01.2015 10:24 # 0
wvxvw 09.01.2015 12:07 # 0
И вообще, у меня есть странное ощущение, что люди, которые занимаются изучением языков программирования и люди которые создают языки программирования - два непересекающихся множества. Даже без каких-то выдающихся познаний в теории или истории изучения языков программирования, читая авторов практически всех языков созданных в 21м* веке, сразу же обнаруживаются и фактические и теоретические несоответствия.
Или, другой вариант: Одерский как бы теоретик и у него все с этим вроде как хорошо, но это не помогает ему принимать хорошие решения - вместо того, чтобы руководствоваться принципом "сделать как лучше", чаще всего получается "сделать как нравится большинству".
* Раст, Меркури и еще несколько - приятные исключения.
По поводу статьи: снова powerful, concise и flexible, semantic и features - матерого Ява-програмиста видно издалека.
roman-kashitsyn 09.01.2015 19:29 # 0
Дважды пытался выучить окамл, дважды забил. Намешали всего, получили месиво фич, паршиво друг с другом сочетающихся. Система типов страдает от мутабельности. Многопоточности нет.
Их приятного только система модулей и, возможно, camlp4.
Уж лучше скалка.
Если кто-то всё же решил выучить этот камл, советую Real World Ocaml, занятное чтиво.
wvxvw 09.01.2015 19:55 # 0
Если бы было время, то приоритеты были бы скорее всего такими: Shen, Mercury / Ciao, Loom, GP2, Rust. Но это не потому, что их где-то можно будет в обозримом будущем использовать, а потому, что интересно понять, как работает.
guest 06.01.2015 20:56 # 0
bormand 08.01.2015 13:35 # 0
roman-kashitsyn 08.01.2015 19:17 # 0
Gradle удобен там, где много жабоспецифики и есть иерархии жабопроектов.
Только если ради fun...
bormand 08.01.2015 21:07 # 0
Вот то, что успел наговнокодить: http://pastebin.com/KAhNF8eM
P.S. Завтра попробую крестопроектик ради интереса портануть на gradle.
roman-kashitsyn 08.01.2015 21:35 # 0
guest 09.01.2015 01:23 # +1
roman-kashitsyn 09.01.2015 10:21 # 0
Чтобы сборка проекта шла менее нескольких минут.
Градл юзабелен, но уж больно тормозной.
> Вообще фейсбук не может ничего путного сжелать
да ты я смотрю иксперт
bormand 09.01.2015 10:43 # 0
Это, походу из-за слишком честной проверки изменений?
roman-kashitsyn 09.01.2015 10:44 # 0
bormand 09.01.2015 13:32 # 0
bormand 09.01.2015 10:47 # 0
Только вот магия имён порой бесит. У меня экзешник назывался storage, ну я и назвал компонент так же, и смотрел как баран на ошибку "свойство storage не найдено"... Вбил как в примерах hello и main - работает. Пришлось назвать компонент storageServer.
wvxvw 11.01.2015 13:22 # 0
bormand 11.01.2015 13:29 # 0
Входных файлов не нашлось, скорее всего, поэтому репак ни одного таска не сгенерил, а в нём самом экшенов нету.
wvxvw 11.01.2015 13:53 # 0
и
Должен делать одно и то же... ну как бы так ведь задумано, и вообще логично преположить по аналогии, да? Но вот делает он что-то непонятное вместо.
bormand 11.01.2015 14:01 # 0
Ну в теории то да, вызывает include на объекте fonts. Но принимает ли fileTree вторым аргументом Closure?
wvxvw 11.01.2015 14:10 # 0
А ссылка на конкретную реалиазцию ведет вникуда. http://www.gradle.org/docs/current/groovydoc/org/gradle/api/Project.html#fileTree%28java.util.Map%29 . Т.е. нужно искать исходники и разбираться. Кстати об интерфейсах...
wvxvw 11.01.2015 14:14 # 0
Так что можно было бы даже с большой долей уверенности предположить, что это должно работать - но тем не менее, хер.
bormand 11.01.2015 14:21 # 0
wvxvw 11.01.2015 15:10 # +1
bormand 11.01.2015 15:32 # 0
SemaReal 25.02.2018 16:07 # 0
А как только он начинает занимать 150 -- так сразу надо что-то править в консерватории