2013-02-18 13 views
40

Sto provando a eseguire task grunt da dentro Maven senza dover installare Node.js o altro. Questo perché non voglio che il mio artefatto sia confezionato da Jenkins e non posso installare Node.js su quella macchina.È possibile compilare il progetto grunt da Maven?

So che è facile con npm e alcuni comandi per farlo funzionare, ma penso anche che dovrebbe essere facile da integrare con Maven, il problema è che non so da dove cominciare da quando sono nuovo a npm.

risposta

27

Sì, utilizzando lo frontend-maven-plugin, è possibile compilare i progetti di Grunt tramite Maven (trovato tramite NodeJS mailing list).

Come sottolinea la documentazione, il plugin ha le seguenti caratteristiche:

  • consentono di mantenere il vostro frontend e backend costruisce come separati il ​​più possibile, riducendo la quantità di interazione tra di loro per il minimo indispensabile ; utilizzando solo 1 plugin.
  • consentono di utilizzare Node.js e le sue librerie nel vostro processo di generazione senza installare Nodo/NPM a livello globale per il vostro sistema di compilazione
  • Let si assicura che la versione del Nodo e NPM in esecuzione è la stessa in ogni ambiente di generazione

Ho attraversato il codice ed è abbastanza semplice. Grazie a Dio, finalmente qualcuno lo ha messo insieme; è una soluzione elegante. Il repository include an example che utilizza un normale Gruntfile.js per richiamare l'analisi jshint.

+0

Questo plugin è fantastico! Citando il README: _Non intendeva sostituire la versione di sviluppo del Node - gli sviluppatori frontend installeranno ancora Node sui loro laptop, ma gli sviluppatori di backend possono eseguire una build pulita senza nemmeno installare Node sul loro computer_ – olivieradam666

+1

Lo uso su più progetti ed è fantastico . Una cosa a cui prestare attenzione è scaricare il nodo per il sistema su cui viene eseguito, quindi se si dispone di un sistema operativo diverso sul server di generazione, è necessario assicurarsi che sia la versione che si è verificata nel controllo della versione, la tua versione locale (per me OSX) dovrà essere mantenuta locale per il tuo progetto. – am80l

+2

Un'altra alternativa è quella di .gitignore della cartella "nodo" (dove finiscono gli eseguibili) in modo che ogni architettura diventi sua. –

15

AGGIORNAMENTO 2014-09-19: Questa non è più la risposta più accurata. Dai un'occhiata ad alcune delle altre risposte di seguito. È stato accurato nel momento in cui ho risposto alla domanda, ma sembra che ci siano stati molti progressi in questo settore da allora.

Ho paura che tu non abbia fortuna. Grunt è costruito utilizzando il nodo e deve essere installato utilizzando npm. Potrebbe essere possibile copiare un'installazione esistente di Grunt da un'altra macchina se non si desidera utilizzare npm, ma continuerà a utilizzare l'eseguibile grunt e tutte le sue dipendenze sul proprio server di build.

In aggiunta a ciò, molte delle attività di Grunt sono implementate come moduli Node.js e sarà necessario installarle. Ancora, potresti essere in grado di copiarli da un altro server, dove hai fatto l'installazione di Node.js/Grunt, ma a un certo punto, devi farlo.

Per eseguire Grunt da Maven, la soluzione migliore è utilizzare il plugin exec di Maven e quindi eseguire il file eseguibile di grunt da lì.

In alternativa, ci sono diversi plugin Maven che consentono di fare cose simili a Grunt in modo Java. Richiedono una configurazione aggiuntiva non compatibile con Grunt, quindi YMMV. Uno che ho usato in passato è http://code.google.com/p/wro4j/, che viene fornito con un plug-in Maven: http://code.google.com/p/wro4j/wiki/MavenPlugin

Qualsiasi motivo particolare per cui non è possibile installare Node.js sul server di build?

+0

Grazie @nwinkler! Risposta molto completa Non c'è una ragione particolare, ho trovato un po 'scomodo installare sistemi di build aggiuntivi quando ne ho già uno in grado di gestire i requisiti del mio progetto. Prima di provare a usare grunt, stavo usando la bussola con Maven per costruire sass: https://gist.github.com/mkristian/1671207. Poi ho visto Grunt che può gestire questo e altro. Dato che con JRuby sono stato in grado di installare le gemme ruby ​​all'interno di una directory di destinazione ed eseguirlo da lì, ho pensato che sarebbe stato possibile ottenere qualcosa di simile con Node.js e Grunt.Sembra che sia possibile, ma non c'è ancora un modo copia e incolla – gfournier

+0

Per eseguire Grunt da Maven puoi usare [grunt-maven-plugin] (https://github.com/allegro/grunt-maven-plugin). Vedi la mia risposta qui sotto. – pbetkier

+0

Consiglierei il ['frontend-maven-plugin'] (https://github.com/eirslett/frontend-maven-plugin), vedere la mia risposta qui sotto. – blong

10

Finalmente ho finito con questo (che è abbastanza vicino, ma non risolve il problema):

<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> 

che consente di installare localmente il grugnito-cli, ma se non ho node.js installati è inutile. Sebbene provi a installare localmente node.js, è necessario aver installato python, g ++ e make. Quindi vado con la soluzione KISS: installa grunt nel build server.

Riferimenti:
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

Un'altra spiegazione completa: http://pseudobry.com/maven-and-r-js-optimization/?replytocom=49#respond – gfournier

1

Il primo problema è che Maven è Java, ma Grunt.js corre sul runtime Node.js. L'integrazione più semplice che abbia mai raggiunto tra i due riguardava il plugin maven-exec-plugin. Il plugin maven-exec-plugin è in grado di eseguire script .sh/.bat/.cmd, qualunque sia il sistema operativo che si sta utilizzando. Così, durante una compilazione di Maven, il maven-exec-plugin eseguirà uno script denominato optimize-js.sh, ad esempio, che farebbe semplicemente qualcosa come "grunt release -force" o qualsiasi altra cosa. Gli script possono essere fatti per fare qualsiasi cosa. L'importante è configurare il plugin maven-exec-plug per eseguirli nella directory di lavoro corretta. Naturalmente, "grunt" e "node" devono essere eseguibili dalla riga di comando.

11

È possibile utilizzare grunt-maven-plugin. Ti consente di integrare facilmente le attività di Grunt nel processo di creazione di Maven. Nessun hack sporco.

Questo è quello che uso nel mio progetto attuale e funziona perfettamente.

+0

Hai provato a integrare qualcosa come [nodejs-maven-plugin] (https: // github .com/skwakman/nodejs-maven-plugin) per astrarre l'installazione runtime di NodeJS? – blong

+0

@ b.long no, non ci piaceva l'idea di avere un artefatto per i nodejs provenienti da un centro di gestione gestito da qualcuno. In questo modo non saremmo in grado di controllare la versione di nodejs, come avere l'ultima versione quando ci piace. – pbetkier

+0

Questo è comprensibile, sicuramente una preoccupazione ragionevole. Grazie per l'aggiornamento :) – blong

6

Si potrebbe voler pagare http://jhipster.github.io/: è un generatore Yeoman, che genera un'applicazione che ha Maven, Grunt e Bower che lavorano tutti insieme.

È un po 'come la terza opzione, ma tutto è configurato per te, il che non è facile. Sta anche generando i servizi base di AngularJS e Java REST per voi

2

Questa è una soluzione copia/incolla completa che funziona nel 2017 utilizzando frontend-maven-plug per front build e maven-war-plug-in per costruire la guerra.

Cosa fa? installa npm, bower bunt e tutto il necessario, quindi esegui l'installazione di npm, bower install e infine grunt build.

È possibile rimuovere/aggiungere i passaggi che si desidera, per me è una libreria e un progetto di installazione/creazione completi di 30 secondi.

<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> 

Poi si può Run as ->Maven build ..., con l'obiettivo clean install e profilo release

+1

Grazie! Sto usando questa soluzione ora! – gfournier

Problemi correlati