Сборка, минимизация и деплой JS средствами Gradle
Рано или поздно любой JS проект вырастает из детских штанцов, обьем и частота коммитов растут, а решение становится сложным комплексом и состоит из десятков JS файлов.
В результате приходится регулярно производить множество операций по склеиванию, минимизации и загрузке на сервер обновленных модулей. День за днем, чекин за чекином ситуация становится все сложнее и грозит выйти из под контроля, выводя из себя, загружая вас рутинной работой. А впереди возможно светит Continous Integration и автоматическое тестирование…
Избавить вас от рутинных хлопот поможет система сборки. Gradle является одной из самых популярных систем на сегодня и постепенно завоевывает все больше сторонников. Приемуществом Gradle является описание build задач в виде кода, а так же возможность запускать Ant и Maven таски.
Специально для комбинации и минимизации JS файлов существует два Gradle плагина – https://launchpad.net/gradle-jslib и https://github.com/eriwen/gradle-js-plugin.
По состоянию на декабрь 2011 года первый обладал хорошими возможностями по комбинации файлов в модули, однако не работал с последней версией Gradle. Рассказ в статье пойдет о втором плагине – он прост в освоении, надежен и снабжен неплохой документацией.
Начнем с установки gradle – она достаточно проста. Качаем свежий пакет с http://gradle.org/downloads . Распаковываем на диске и добавляем подпапку bin в path. Как добавить переменную в path – можете почитать тут http://stackoverflow.com/questions/7703041/editing-path-variable-on-mac.
Проверить работоспособность Gradle мы можем выполнив команду gradle
в терминале.
Следующий шаг – написание непосредственно Gradle скрипта.
buildscript { repositories { mavenCentral() } dependencies { //Устанавливаем плагин из Maven репозитория classpath 'com.eriwen:gradle-js-plugin:0.3' } } //Применяем плагин apply plugin: 'js' //Таск плагина на склеивание, задаем inputs и outputs combineJs { file1 = fileTree(dir: "${projectDir}/src/Core", includes: ['Framework/core.js']) file2 = fileTree(dir: "${projectDir}/src/Core", includes: ['Framework/strings.js']) file3 = fileTree(dir: "${projectDir}/src/Core", includes: ['Framework/dom.js']) inputs.files file1 + file2 + file3 outputs.file file("${projectDir}/min/corecombined.js") } //Таск плагина на минификацию, задаем inputs и outputs minifyJs { inputs.files fileTree(dir: "${projectDir}/min", include: "corecombined.js") outputs.file file("${projectDir}/min/core.min.js") }
А для деплоя используем Ant таск, который опишем в отдельном файле – deploycore.xml, а затем запустим из gradle – скрипта :
<project> <target name="deployFiles"> //По этому имени таск будет доступен из Gradle <echo message="ANT_HOME is set to = ${basedir}" /> <taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"> <classpath> <pathelement location="${basedir}/antlibs/ant-commons-net.jar" /> <pathelement location="${basedir}/antlibs/commons-net-3.0.1.jar" /> <pathelement location="${basedir}/antlibs/jakarta-oro-2.0.8.jar" /> </classpath> </taskdef> <ftp server="staging.oggifinogi.com" userid="administrator" password="xxx" port="21" remotedir="/components" passive="yes" binary="no"> <fileset dir="min/"> <include name="*.min.js" /> </fileset> </ftp> </target> </project>
Добавим последнюю строку в core.gradle, которая загрузит все файлы с маской *.min.js на FTP :
ant.importBuild 'deploy.xml'
И наконец – вызываем gradle из консоли:
gradle -b=core.gradle combineJs minifyJs deployFiles
Наши файлы скомбинированы, уменьшены и загружены на сервер.
Теперь вы можете уделить больше времени написанию кода.