2013-02-18 5 views
40

Я пытаюсь выполнить задания grunt изнутри maven без необходимости установки Node.js или чего-то еще. Это потому, что я не хочу, чтобы мой артефакт был упакован Дженкинсом, и я не могу установить Node.js на эту машину.Можно ли скомпилировать проект grunt от maven?

Я знаю, что с npm и с несколькими командами легко работать, но я также думаю, что это должно быть легко интегрироваться с maven, проблема в том, что я не знаю, с чего начать, так как я новый для npm.

ответ

27

Да, используя frontend-maven-plugin, вы можете скомпилировать проекты Grunt через Maven (найдено через NodeJS mailing list).

Как документация указывает, плагин имеет следующие особенности:

  • Пусть вам сохранить ваш внешний интерфейс и бэкенд строит как отдельные, насколько это возможно, за счет уменьшения количества взаимодействия между ними до минимума ; используя только 1 плагин.
  • Пусть использовать Node.js и его библиотеки в процессе сборки без установки Node/НМП глобально для вашей системы сборки
  • Пусть вы убедитесь, что версия узла и НПМ запущенной является одинаковым в каждой среде сборки

Я прошел через код, и это довольно просто. Слава богу, кто-то наконец положил это вместе; это элегантное решение. Репозиторий включает an example, который использует регулярный Gruntfile.js для вызова анализа jshint.

+0

Этот плагин замечательный! Цитата README: _Не хочу заменить версию разработчика Node - разработчики frontend все равно установят Node на своих ноутбуках, но разработчики backend могут запускать чистую сборку, даже не устанавливая Node на свой компьютер. – olivieradam666

+1

Я использую это для нескольких проектов, и это потрясающе , Одна вещь, о которой нужно знать, это загрузить узел для системы, в которой он выполняется, поэтому, если на вашем сервере сборки есть другая ОС, вам нужно убедиться, что это версия, которую вы проверили в управлении версиями, ваша локальная версия (для меня OSX) должна поддерживаться локально в вашем проекте. – am80l

+2

Другой альтернативой является .gitignore в папке «node» (где заканчиваются исполняемые файлы), поэтому каждая архитектура получает свои собственные. –

15

ОБНОВЛЕНИЕ 2014-09-19: Это уже не самый точный ответ - пожалуйста, ознакомьтесь с некоторыми другими ответами ниже. Это было точно в то время, когда я ответил на этот вопрос, но с тех пор, похоже, с этой точки зрения был достигнут значительный прогресс.

Боюсь, что вам не повезло. Grunt построен с использованием узла и должен быть установлен с использованием npm. Возможно, вы сможете скопировать существующую установку Grunt с другого компьютера, если вы не хотите использовать npm, но все равно будете использовать исполняемый файл grunt и все его зависимости на вашем сервере сборки.

В дополнение к этому многие задачи Grunt реализованы как модули Node.js, и вам также придется их установить. Опять же, вы можете скопировать их с другого сервера, где вы сделали установку Node.js/Grunt, но в какой-то момент вам нужно это сделать.

Для запуска Grunt из Maven лучше всего использовать плагин Maven exec, а затем выполнить исполняемый файл grunt.

В качестве альтернативы есть несколько плагинов Maven, которые позволяют вам делать вещи, похожие на Grunt, на основе Java. Они требуют дополнительной конфигурации, несовместимой с Grunt, поэтому YMMV. Один из них, который я использовал в прошлом, - http://code.google.com/p/wro4j/, который также поставляется с плагином Maven: http://code.google.com/p/wro4j/wiki/MavenPlugin

Любая конкретная причина, по которой вы не можете установить Node.js на свой сервер сборки?

+0

Благодаря @nwinkler! Очень полный ответ. Нет особой причины, мне было немного неудобно устанавливать дополнительные системы сборки, когда у меня уже есть тот, который может справиться с требованиями моего проекта. Прежде чем пытаться использовать grunt, я использовал компас с maven для создания sass: https://gist.github.com/mkristian/1671207. Затем я увидел, что Грунт может справиться с этим и более. Поскольку с JRuby я смог установить рубиновые драгоценности внутри целевого каталога и запустить его оттуда, я подумал, что с Node.js и Grunt можно добиться чего-то подобного.Кажется, что это возможно, но нет способа копирования и вставки еще – gfournier

+0

Для запуска Grunt из Maven вы можете использовать [grunt-maven-plugin] (https://github.com/allegro/grunt-maven-plugin). См. Мой ответ ниже. – pbetkier

+0

Я бы рекомендовал ['frontend-maven-plugin'] (https://github.com/eirslett/frontend-maven-plugin), см. Мой ответ ниже. – blong

10

Наконец я закончил с этим (что достаточно близко, но не решает проблему):

<plugin> 
<groupId>org.mule.tools.javascript</groupId> 
<artifactId>npm-maven-plugin</artifactId> 
<version>1.0</version> 
<executions> 
    <execution> 
     <phase>generate-resources</phase> 
      <goals> 
       <goal>fetch-modules</goal> 
      </goals> 
      <configuration> 
       <packages> 
        <package>grunt-cli:0.1.6</package> 
       </packages> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

, который устанавливается локально хрюкать-кли, но если у меня нет установленных node.js это бесполезно. Хотя я пытаюсь установить node.js локально, необходимо установить python, g ++ и make. Поэтому я пойду с решением KISS: установите grunt на сервере сборки.

Ссылки:
https://github.com/mulesoft/npm-maven-plugin
https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
https://github.com/mcheely/requirejs-maven-plugin

+0

Другое приветственное объяснение: http://pseudobry.com/maven-and-r-js-optimization/?replytocom=49#respond – gfournier

1

Первая проблема заключается в том, что Maven является Java, но Grunt.js работает на время выполнения Node.js. Самая простая интеграция, которую я когда-либо достигал между двумя, включала maven-exec-plugin. Плагин maven-exec способен выполнять сценарии .sh/.bat/.cmd, в зависимости от того, какие из них являются родными для используемой ОС. Поэтому во время сборки Maven у меня был бы, например, maven-exec-plugin скрипт с именем optimize-js.sh, который бы просто делал что-то вроде «grunt release -force» или что-то еще. Сценарии могут быть сделаны, чтобы делать что угодно. Важно настроить maven-exec-plugin для их выполнения в правильном рабочем каталоге. Конечно, из командной строки необходимо выполнить «grunt» и «node».

11

Вы можете использовать grunt-maven-plugin. Это позволяет легко интегрировать задачи Grunt в процесс сборки Maven. Никаких грязных хаков.

Это то, что я использую в своем текущем проекте, и оно работает просто отлично.

+0

Вы пытались интегрировать что-то вроде [nodejs-maven-plugin] (https: // github .com/skwakman/nodejs-maven-plugin), чтобы абстрагировать установку времени исполнения NodeJS? – blong

+0

@ b.long no, нам не понравилась идея иметь артефакт для nodejs, исходящих из центра maven, управляемого кем-то. Таким образом, мы не сможем контролировать версию nodejs, например, иметь самую последнюю версию, когда нам это нравится. – pbetkier

+0

Это понятно, безусловно, разумная забота. Спасибо за обновление :) – blong

6

Возможно, вы захотите заказать http://jhipster.github.io/: это генератор Йомен, который генерирует приложение, в котором Maven, Grunt и Bower работают вместе.

Это немного похоже на ваш третий вариант, но все настроено для вас, что не так просто. Он также генерирует базовые услуги AngularJS и Java REST для вас

1

Если проблема заключается в установке NodeJS на машине Jenkins, вы можете использовать плагин NodeJS Jenkins.

https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin

Мы не используем его с Maven (пока), но мы получили черновой ход.

2

Это полнофункциональное копировально-пастовое решение, которое работает в 2017 году, используя frontend-maven-plugin для фронтальной сборки и maven-war-plugin для построения войны.

Что он делает? установите npm, bunt grunt и все, что вам нужно, затем запустите npm install, bower install и, наконец, grunt build.

Вы можете удалить/добавить замену шагов, которые вы хотите, для меня это полная библиотека установки и сборки на 30 секунд и проект.

<dependencies> 
    ... 
</dependencies> 

<dependencyManagement> 
    <dependencies> 
     <!-- https://mvnrepository.com/artifact/com.github.eirslett/frontend-maven-plugin --> 
     <dependency> 
      <groupId>com.github.eirslett</groupId> 
      <artifactId>frontend-maven-plugin</artifactId> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <warSourceDirectory>src/main/webapp/YourFrontJsFolder/dist</warSourceDirectory> 
        <warName>YouWarName</warName> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
        <warSourceExcludes>node_modules/**</warSourceExcludes> 
        <includeScope>system</includeScope> 
        <webResources> 
         <resource> 
          <directory>WebContent/WEB-INF</directory> 
          <targetPath>WEB-INF</targetPath> 
          <includes> 
           <include>**/*.jar</include> 
           <include>**/*.jsp</include> 
          </includes> 
         </resource> 
        </webResources> 
       </configuration> 
      </plugin> 

      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
        <encoding>Cp1252</encoding> 
       </configuration> 
      </plugin> 
     </plugins> 
    </pluginManagement> 

    <finalName>YourAppName</finalName> 
</build> 

<profiles> 
    <profile> 
     <id>release</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>com.github.eirslett</groupId> 
        <artifactId>frontend-maven-plugin</artifactId> 
        <executions> 
         <execution> 
          <!-- optional: you don't really need execution ids, but it looks 
           nice in your build log. --> 
          <id>install node and npm</id> 
          <goals> 
           <goal>install-node-and-npm</goal> 
          </goals> 
          <!-- optional: default phase is "generate-resources" --> 
          <phase>generate-resources</phase> 

          <configuration> 
           <nodeVersion>v7.6.0</nodeVersion> 
          </configuration> 
         </execution> 

         <execution> 
          <id>npm install</id> 
          <goals> 
           <goal>npm</goal> 
          </goals> 

          <!-- optional: default phase is "generate-resources" --> 
          <phase>generate-resources</phase> 

          <configuration> 
           <arguments>install</arguments> 
          </configuration> 
         </execution> 

         <execution> 
          <id>bower install</id> 
          <goals> 
           <goal>bower</goal> 
          </goals> 

          <configuration> 
           <!-- optional: The default argument is actually "install", so unless 
            you need to run some other bower command, you can remove this whole <configuration> 
            section. --> 
           <arguments>install</arguments> 
          </configuration> 
         </execution> 

         <execution> 
          <id>grunt build</id> 
          <goals> 
           <goal>grunt</goal> 
          </goals> 

          <!-- optional: the default phase is "generate-resources" --> 
          <phase>generate-resources</phase> 

          <configuration> 
           <!-- optional: if not specified, it will run Grunt's default task 
            (and you can remove this whole <configuration> section.) --> 
           <arguments>build</arguments> 
          </configuration> 
         </execution> 
        </executions> 

        <configuration> 
         <installDirectory>target</installDirectory> 
         <workingDirectory>src/main/webapp/YourFrontJsFolder</workingDirectory> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>debug</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
    </profile> 
    <profile> 
     <id>IDE</id> 
     <activation> 
      <property> 
       <name>m2e.version</name> 
      </property> 
     </activation> 
     <build> 
      <!-- Put the IDE's build output in a folder other than target, so that 
       IDE builds don't interact with Maven builds --> 
      <directory>target-ide</directory> 
     </build> 
    </profile> 
</profiles> 

Тогда вы можете Run as ->Maven build ..., с целью clean install и профиль release

+1

Спасибо! Я использую это решение сейчас! – gfournier

Смежные вопросы