web-dev-qa-db-fra.com

Comment déployer une application node.js avec maven?

La plupart de notre équipe est composée de développeurs Java et donc l'ensemble du système de gestion de build/déploiement/dépendance est construit sur maven. Nous utilisons CI pour que chaque processus de build exécute des tests unitaires (w. Karma et phantomJS pour le frontend, et jasmine-node pour le backend) .J'ai réussi à configurer un plugin karma maven à cet effet.

Cela ne résout pas le problème du téléchargement des dépendances node.js à partir de package.json lors de la construction. J'ai besoin de déployer mon application node.js/express dans l'environnement existant, donc le scénario parfait serait:

  1. tirer du repo (fait automatiquement avec maven build)
  2. npm install (c'est-à-dire le téléchargement des dépendances à partir du registre des packages de nœuds)
  3. exécution de tests

J'essayais de trouver un package nodejs pour maven, mais pour être honnête - en tant que développeur node.js, je ne me sens pas très confiant quand il s'agit de choisir les bons outils, car je ne suis pas en mesure de distinguer un mauvais plugin maven de un décent.

Peut-être en utilisant un plugin Shell et en invoquant npm install du terminal est un meilleur choix?

Quelle est votre opinion?

45
Rafal Pastuszak

Vous avez deux choix:

En tant que solution hacky, bien que toujours possible, vous pouvez, comme vous l'avez mentionné vous-même, utiliser quelque chose comme maven-antrun-plugin pour exécuter réellement npm avec maven.

Toutes les approches ont leurs avantages et leurs inconvénients, mais le plugin frontend-maven semble être l'approche la plus souvent utilisée - mais il suppose que votre serveur ci peut télécharger à partir des paquets arbitraires Internet, tandis que la solution "hacky" devrait également fonctionner, lorsque votre Le serveur ci n'a aucune connexion à Internet (en plus du mandataire du dépôt central de Maven)

27
Christian Ulbrich

Je pense que vous pouvez trouver la réponse dans Grunt et les nombreux plugins disponibles.

Je travaille actuellement sur un projet web où le côté client est fait avec AngularJS. Néanmoins, je pense que le processus de déploiement peut partiellement répondre à votre question:

Dans votre pom.xml, vous pouvez faire quelque chose comme ça:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <id>exec-gen-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <target name="Build Web">

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c npm install" />
                    </exec>

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c bower install --no-color" />
                    </exec>

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c grunt release --no-color --force" />
                    </exec>

                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  • La première partie est le npm install tâche: téléchargement des dépendances à partir du package de nœuds.

  • La deuxième partie est le bower install tâche: téléchargement d'autres dépendances avec bower (dans mon cas, AngularJS, mais vous pourriez ne pas avoir besoin de cette partie)

  • La troisième partie est le Grunt Release part: lancement d'une tâche Grunt qui inclut Karma tests unitaires.

Vous pouvez trouver de la documentation sur Gruntici . Il existe de nombreux plugins disponibles comme Karma tests unitaires.

J'espère que cela vous a aidé.

15
Pear

J'ai fait fonctionner le processus npm pour mon AngularJS 2 + Spring Boot application par exec-maven-plugin. Je n'utilise pas bower and grunt, mais je pense que vous pouvez aussi le faire fonctionner avec exec-maven-plugin, après avoir regardé l'exemple antrun ci-dessus de Pear.

Ci-dessous mon exemple pom.xml pour exec-maven-plugin. Mon application a package.json et tous les fichiers AngularJS .ts sont sous src/main/resources, donc exécutez npm à partir du chemin. J'exécute npm install pour les dépendances et npm run tsc pour la conversion .ts à .js

pom.xml

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>exec-npm-install</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}/src/main/resources</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>install</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
                <execution>
                    <id>exec-npm-run-tsc</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}/src/main/resources</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>run</argument>
                            <argument>tsc</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Un petit hack à ce sujet consiste à exécuter maven build sur Eclipse avec Windows ou Mac. Cela convient parfaitement à Eclipse avec Linux ou même à la fenêtre de commande Windows. Lorsqu'il est exécuté sur Eclipse avec Windows, il ne comprend pas npm et se plaint de ne pas trouver le fichier. La chose étrange est que npm fonctionne bien sur la fenêtre de commande Windows. Donc, résoudre le hack que je crée npm.bat sous le chemin du système. Dans mon cas, nodejs et npm sont installés sous C:\Program File\nodejs. Après avoir mis ce fichier batch. tout fonctionne bien.

npm.bat

@echo off
set arg1=%1
set arg2=%2
C:\Progra~1\nodejs\npm.cmd %arg1% %arg2%

Pour Mac, j'ai eu le même problème sur Eclipse. Le problème est que nodejs et npm sont installés sous/usr/local/bin. Donc, pour résoudre le problème, je crée un lien symbolique/usr/local/bin/node et/usr/local/bin/npm sous/user/bin. Cependant/usr/bin est protégé dans la politique de sécurité, je l'ai fait après le démarrage à partir du disque de récupération

10
Steve Park