Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   автоматизация рутины (https://javascript.ru/forum/offtopic/28494-avtomatizaciya-rutiny.html)

Tim 22.05.2012 02:55

автоматизация рутины
 
Рассказ о том как я избавляюсь он некоторого колличества рутинной работы. Хотелось бы услышать кто что думает? Может кто то знает более красивые решения? Вообще занимается кто нибудь подобной ерундой? Я относительно недавно к этому пришёл.


Структура каталога js-скриптов:
Код:

- js/
  - script_1/
    - fub_1.script_1.js
    - fub_2.script_1.js
  - script_2/
    - fub_1.script_2.js
    - fub_2.script_2.js
  - script_1.min.js
  - script_2.min.js

- Принцип именования файлов только для наглядности, его задача - показать, что все файлы которые в последствии будут сшиты в "script_1.min.js" находятся в папке "script_1".
- Также в папке "js" лежит файл "javascript.php". Он подключает скрипты на страницу. Либо "исходники", либо сжатые файлы, в зависимости от $_SERVER['HTTP_HOST'];. В "javascript.php" дял каждого файла определён массив вида: array('version' => 'x.xx', 'pages' => array('xxx', 'yyy')), где version - версия скрипта, pages - разделы сайта к которым скрипт подключается. На сервере настроено кеширование (заголовки Expires , Cache-Control).
- Сжатие скриптов производится Google Closure Compiler'ом. Есть скрипт генерирующий инструкци для командной строки запускающие сжатие скриптов.
- Папки script_1, script_2, ... script_n добавлены в список исключений в настройках развёртывания WebStorm.


Итого (как всё происходит):
1. Пишем код добавляя/удаляя файлы в папках script_x. Заботиться о подключении не нужно, всё настраивается один раз. Сами файлы script_1.min.js у меня достаточно большие, поэтому очень удобно в процессе разработки разбивать их на более мелкие фрагменты.
2. Правим значение version дял изменённых файлов и сжимаем файлы.
3. Заливаем папку "js" на сервер. Благодаря настройкам развёртывания зальются только сжатые скрипты и файл "javascript.php".

Kolyaj 22.05.2012 09:45

В таких моделях возникает проблема слежения за зависимостями между файлами.

Допустим понадобился вам script1.js, подключили к проекту, а он, оказывается, требует себе script2.js. Ну без проблем, подключили script2.js, всё работает. Через пол-года script1.js по каким-то причинам стал не нужен, но его зависимости уже никто не помнит. script1.js исключаем из проекта, script2.js продолжает там болтаться мёртвым грузом.

Второй случай: миграция скриптов между проектами. Проектами в узком смысле этого слова, просто между страницами одного проекта. Подключаем скрипт с другой страницы, а он, оказывается, хочет ещё один оттуда же, а тот в свою очередь ещё парочку. Подключаем скрипты один за другим, попутно разрешая возникающие конфликты. И вместо того, чтобы писать код, пол дня ушло на подключение своих же скриптов в свой же проект, но на другую страницу.

Я предпочитаю, когда в каждом файле указаны его зависимости. У меня это выглядит, как серия комментариев //#include script.js в начале файла. В результате нужно думать, только какие функции из какого файла нужны в текущем файле, а подключаемые файлы свои зависимости сами привезут.

melky 22.05.2012 09:54

у меня чуть по-другому :
Код:

- scripts
  - myscript
    - begin.js
    - end.js
    - functions.js
  - myscript 2
    - тоже
    - разбито
    - по смысловым файлам

в папке scripts - все скрипты. далее, в ней находятся папки с скриптами (частные имена), а в них - разбитые по смысле файлы, которые воедино собранные, составляют сам скрипт.

процесс сборки: где-нибудь лежит Makefile (ещё не определился с его местонахожденим, но пока в каждой папке скрипта он лежит), который собирает скрипт и "компилирует", т.е. обрабатывает его в GCC в обычном\advanced режиме.

пример Makefile :
Код:

TARGET=anim.js
MIN=$(TARGET).min
COMPILER_PATH=/home/melky/GCC/compiler.jar

all: clean build min

min: build
        /usr/bin/java -jar $(COMPILER_PATH) --js $(TARGET) --warning_level VERBOSE
--js_output_file $(MIN) --formatting PRETTY_PRINT --compilation_level SIMPLE_OPTIMIZATIONS

adv-min: build
        /usr/bin/java -jar $(COMPILER_PATH) --js $(TARGET) --warning_level VERBOSE
--js_output_file $(MIN) --formatting PRETTY_PRINT --compilation_level ADVANCED_OPTIMIZATIONS

build:
        cat {begin,init,transitions,classic,css,end}.js > $(TARGET)

clean:
        rm -f $(TARGET)

в будущем буду добаратывать этот способ сборки файлов :) да и сам Makefile коряв, я знаю. писался на скорую руку.

пишу в Vim, там сборка под рукой :
когда вношу изменения в файл, ввожу две команды
Код:

:w (сохранить файл)
:make build (пересобрать текущий скрипт)

хочу это соединить в одну, но пока до прочтения манов тоже руки не доходят

Kolyaj 22.05.2012 10:03

Цитата:

Сообщение от melky
пишу в Vim, там сборка под рукой :

Сборка должна быть не под рукой, а на лету при разработке :)

melky 22.05.2012 10:15

Цитата:

Сообщение от Kolyaj (Сообщение 175915)
Сборка должна быть не под рукой, а на лету при разработке :)

она будет на лету, будучи включенной в команду сохранения )

B~Vladi 22.05.2012 10:31

Цитата:

Сообщение от Tim
Вообще занимается кто нибудь подобной ерундой?

Ну я занимался. Там ещё не всё сделано, но твою логику сборки можно настроить без проблем.

Tim 22.05.2012 12:04

B~Vladi,
Было в закладках уже. Видимо встречал тему на форуме, но забыл. Времени как то всё нет. А эта штука под виндой запустится?

melky,
Make-файлы и vim это не для меня. У меня стоит убунта свежая, я там даже апач настроил полностью, но привыкнуть не могу не как. Месяца 2 уже не запускал её. Если бы не было семёрки я бы точно на линукс перебрался, а так пока нет.

Kolyaj,
С инклудами хорошая идея, возьму на вооружение. Правда у меня пока не на столько всё сложно.

B~Vladi 22.05.2012 12:21

Цитата:

Сообщение от Tim
А эта штука под виндой запустится?

Да, это полностью кроссплатформенно. Я позже ещё займусь им, можем вместе развивать.

Kolyaj 22.05.2012 12:21

Наш кэп,
ну то есть при разработке то, что понаписал, запускать необязательно? Ну так, ради интереса, работает ли.

melky 22.05.2012 12:38

Цитата:

Сообщение от Tim
melky,
Make-файлы и vim это не для меня. У меня стоит убунта свежая, я там даже апач настроил полностью, но привыкнуть не могу не как. Месяца 2 уже не запускал её. Если бы не было семёрки я бы точно на линукс перебрался, а так пока нет.

а я легко смог перебраться, т.к. с нуля "настраивал линупс", и сделал всё, как мне удобно. правда, время на это потратил... но у меня оно есть. Makefile легко заменяется на BATCH.

тут ещё зависит кое-что другое... вы в чём код пишете?

я раньше любил notepad++ и не любил IDE'шки. но в нём мне не хватало навигатора по коду, что я с лёгкостью сделал в виме. в принципе, последний у меня превращён в notepad++ на линуксе.

Tim 22.05.2012 14:34

Цитата:

Сообщение от melky (Сообщение 175961)
я раньше любил notepad++ и не любил IDE'шки. но в нём мне не хватало навигатора по коду

та же история. сейчас notepad++ использую только для php. всё остальной в WebStorm

B~Vladi 22.05.2012 14:57

Цитата:

Сообщение от Kolyaj
на лету при разработке

А если процесс сборки будет занимать много времени? GCC не такой уж и быстрый.
Не лучше ли разделить на dev и prod-режимы?

Kolyaj 22.05.2012 15:31

GCC нормальный, это java запускается не быстро, обычно из-за антивируса. Но это всё неважно, т.к. при разработке gcc не нужен, сжимать файлы нужно только при выкладке, на лету нужно только собирать.

Цитата:

Сообщение от B~Vladi
Не лучше ли разделить на dev и prod-режимы?

Ну дык в процитированном тобой сообщении есть фраза "при разработке".

B~Vladi 22.05.2012 16:33

Цитата:

Сообщение от Kolyaj
Ну дык в процитированном тобой сообщении есть фраза "при разработке".

А, я подумал делать полную сборку при разработке.

Я много размышлял на эту тему. Как вам такая схема.
К примеру, у нас 1 файл разбит на несколько для удобства. В сборщике указываем нужные файлы, которые будут соединены в файл fileName.js. Пример, как бы это выглядело в моем сборщике:
{ // Конфиг модуля JSCompressor
  'lib.js': { // Некая абстрактная либа
    'includes': 'lib/*'
  }
  'fileName.js': {
    'includes': ['fileName/file1.js', 'fileName/file2.js']
    'depends': ['lib.js'] // Зависимости
  }
}

Т.е. все зависимости указываются в конфиге сборщика, а не в исходниках.
В шаблоне указываем путь к этому js-файлу:
script src="www.domain.com/fileName.js"

Сборщик находит путь /fileName.js, ищет для этого файла зависимости (depends) и добавляет перед ним HTML-код подключения скрипта lib.js.

Таким образом все зависимости собраны в одном месте, а не разбросаны по исходникам. Кроме этого код файла lib.js не будет дублироваться в собранных файлах. Если же всё таки нужно его дублировать - просто перепишем конфиг без использования depends:
{ // Конфиг сборщика
  'JSCompressor': {
    'configs': [{ // Сначала собираются либы
      'lib.js': {
        'includes': 'lib/*'
      }
    },
    { // Потом остальное
      'fileName.js': {
        'includes': ['fileName/file1.js',
                       'fileName/file2.js']
      },
     { // Конкатенация зависимого кода
       'fileName.js': {
         'includes': ['lib.js',
                        'fileName.js']
       }
     }
    }]
  }
}


Как думаете, такая схема будет удобна?

Kolyaj 22.05.2012 16:48

Цитата:

Сообщение от B~Vladi
Как думаете, такая схема будет удобна?

2-е сообщение в теме.

B~Vladi 22.05.2012 17:01

Цитата:

Сообщение от Kolyaj
2-е сообщение в теме.

Ок, первый случай: выпиливаем код сборки script1.js из конфига и script2.js уже не будет подключаться (так как команда подключения в этой части кода).

Второй случай: конфиг сборки создается для всего проекта, а не для отдельных страниц. Если на другой странице мы подключим script1.js - остальное так же подтянется из конфига.

Видимо, ты не до конца вник в схему...

Kolyaj 22.05.2012 17:40

B~Vladi,
ну то есть то же самое, что сказал я, только с выносом подключающих директив в отдельный файл.

B~Vladi 22.05.2012 17:46

Цитата:

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

Ну получается что так. Остановлюсь пока на этом варианте.

Хм, как-то не красиво получилось. Tim начал про свою либу, а я со своей влез.

Tim 23.05.2012 02:38

B~Vladi,
Всё норм, не парься. =) У меня и либы то собственно не какой нет. Я как раз хотел послушать что другие делают.

B~Vladi 23.05.2012 10:23

Цитата:

Сообщение от Tim
Я как раз хотел послушать что другие делают.

Послушал? Что думаешь? :)

Tim 23.05.2012 10:44

Цитата:

Сообщение от B~Vladi (Сообщение 176174)
Послушал? Что думаешь? :)

Думаю что зависимости нужно будет тоже учитывать, хотя пока необходимости нет да и времени тоже. Спасибо всем кто откликнулся, я ожидал что максимум флудом всё закончится. :)

Kolyaj 23.05.2012 10:57

Цитата:

Сообщение от Tim
да и времени тоже.

На что времени нет? У каждого в этой теме есть готовое оттестированное решение. Бери любое.


Часовой пояс GMT +3, время: 15:02.