42 votes

Est-il possible de compiler un projet grunt à partir de maven ?

J'essaie d'exécuter des tâches grunt à partir de maven sans avoir besoin d'installer Node.js ou autre. C'est parce que je ne veux pas que mon artefact soit empaqueté par Jenkins et je ne peux pas installer Node.js sur cette machine.

Je sais que c'est facile avec npm et quelques commandes pour le faire fonctionner, mais je pense aussi qu'il devrait être facile de l'intégrer avec maven, le problème est que je ne sais pas par où commencer puisque je suis nouveau à npm.

30voto

b.long Points 1067

Oui, en utilisant le frontend-maven-plugin vous pouvez compiler les projets Grunt à l'aide de Maven (que vous trouverez via l'onglet Liste de diffusion NodeJS ).

Comme l'indique la documentation, le plugin présente les caractéristiques suivantes :

  • Vous permet de séparer autant que possible vos constructions frontale et dorsale, en réduisant la quantité d'interaction entre elles au strict minimum ; en utilisant un seul plugin.
  • Vous permet d'utiliser Node.js et ses bibliothèques dans votre processus de construction sans installer Node/NPM globalement pour votre système de construction.
  • Vous permet de vous assurer que la version de Node et de NPM exécutée est la même dans chaque environnement de construction.

J'ai parcouru le code et il est assez simple. Dieu merci, quelqu'un a finalement mis cela en place ; c'est une solution élégante. Le référentiel comprend un exemple qui utilise une Gruntfile.js pour invoquer l'analyse jshint.

0 votes

Ce plugin est génial ! Je cite le README : Il ne s'agit pas de remplacer la version de Node destinée aux développeurs - les développeurs frontaux continueront d'installer Node sur leurs ordinateurs portables, mais les développeurs backend peuvent exécuter une construction propre sans même installer Node sur leur ordinateur.

1 votes

Je l'utilise sur plusieurs projets et il est génial. Si vous avez un système d'exploitation différent sur votre serveur de construction, vous devrez vous assurer que c'est la version que vous avez vérifiée dans le contrôle de version, votre version locale (pour moi OSX) devra être maintenue localement dans votre projet.

2 votes

Une autre alternative est de .gitignore le dossier "node" (où les exécutables finissent) afin que chaque architecture ait le sien.

15voto

nwinkler Points 5889

MISE À JOUR 2014-09-19 : Cette réponse n'est plus la plus précise - veuillez consulter les autres réponses ci-dessous. Elle était exacte au moment où j'ai répondu à la question, mais il semble qu'il y ait eu pas mal de progrès dans ce domaine depuis.

Je crains que vous n'ayez pas de chance. Grunt est construit à l'aide de node et doit être installé à l'aide de npm. Vous pouvez peut-être copier une installation existante de Grunt à partir d'une autre machine si vous ne voulez pas utiliser npm, mais vous utiliserez quand même l'extension grunt et toutes ses dépendances sur votre serveur de construction.

En plus de cela, de nombreuses tâches de Grunt sont implémentées en tant que modules Node.js, et vous devrez également les installer. Encore une fois, vous pouvez les copier d'un autre serveur, où vous avez fait l'installation de Node.js/Grunt, mais à un moment donné, vous devez le faire.

Pour exécuter Grunt à partir de Maven, votre meilleure chance est d'utiliser le plugin Maven exec et d'exécuter l'exécutable Grunt à partir de là.

En guise d'alternative, il existe plusieurs plugins Maven qui vous permettent de faire des choses similaires à Grunt en utilisant Java. Ils nécessitent une configuration supplémentaire non compatible avec Grunt, donc YMMV. L'un d'entre eux, que j'ai utilisé dans le passé, est le suivant http://code.google.com/p/wro4j/ qui est également livré avec un plugin Maven : http://code.google.com/p/wro4j/wiki/MavenPlugin

Y a-t-il une raison particulière pour laquelle vous ne pouvez pas installer Node.js sur votre serveur de construction ?

0 votes

Merci @nwinkler ! Réponse très complète. Il n'y a pas de raison particulière, je trouvais un peu gênant d'installer des systèmes de construction supplémentaires alors que j'en ai déjà un qui peut gérer les exigences de mon projet. Avant d'essayer d'utiliser grunt, j'utilisais compass avec maven pour construire sass : gist.github.com/mkristian/1671207 . Puis j'ai vu Grunt qui peut gérer cela et plus encore. Puisque avec JRuby j'étais capable d'installer les gems ruby dans un répertoire cible et de l'exécuter à partir de là, j'ai pensé que quelque chose de similaire pourrait être réalisé avec Node.js et Grunt. Il semble que c'est possible, mais il n'y a pas encore de méthode de copier-coller.

0 votes

Pour exécuter Grunt à partir de Maven, vous pouvez utiliser grunt-maven-plugin . Voir ma réponse ci-dessous.

0 votes

Je recommande le frontend-maven-plugin voir ma réponse ci-dessous.

11voto

pbetkier Points 212

Vous pouvez utiliser grunt-maven-plugin . Il vous permet d'intégrer facilement des tâches Grunt dans le processus de construction Maven. Pas de bidouillage sale.

C'est ce que j'utilise dans mon projet actuel et cela fonctionne parfaitement.

0 votes

Avez-vous essayé d'intégrer quelque chose comme le nodejs-maven-plugin pour abstraire l'installation du runtime NodeJS ?

0 votes

@b.long non, nous n'aimions pas l'idée d'avoir un artefact pour nodejs venant de maven central géré par quelqu'un. De cette façon, nous ne serions pas en mesure de contrôler la version de nodejs, comme avoir la dernière version quand nous le voulons.

0 votes

C'est compréhensible, c'est certainement une préoccupation raisonnable. Merci pour la mise à jour :)

10voto

gfournier Points 398

Finalement, j'ai abouti à ceci (qui est assez proche mais ne résout pas le problème) :

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

qui installe localement la grunt-cli, mais si je n'ai pas installé node.js, cela ne sert à rien. Bien que j'essaie d'installer node.js localement, il est nécessaire d'avoir installé python, g++ et make. Je vais donc opter pour la solution KISS : installer grunt dans le serveur de construction.

Références :
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 votes

Une autre excellente explication : pseudobry.com/maven-and-r-js-optimization/

6voto

krishan Points 443

Vous pourriez vouloir vérifier http://jhipster.github.io/ Il s'agit d'un générateur Yeoman, qui génère une application dans laquelle Maven, Grunt et Bower travaillent ensemble.

C'est un peu comme votre troisième option, mais tout est configuré pour vous, ce qui n'est pas si facile. Elle génère également les services REST AngularJS et Java de base pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X