2013-06-14 3 views
30

Der größte Teil unseres Teams besteht aus Java-Entwicklern und daher ist das gesamte Build/Deployment/Dependency-Management-System auf Maven aufgebaut. Wir verwenden CI, so dass jeder Build-Prozess Unit-Test ausführt (w. Karma und PhantomJS für das Frontend und Jasmine-Node für das Backend). Ich habe es geschafft, ein Karma Maven Plugin für diesen Zweck zu konfigurieren.Wie stelle ich eine node.js App mit maven bereit?

Das Problem des Herunterladens von node.js-Abhängigkeiten von package.json on build wird dadurch nicht gelöst. Ich brauche meine node.js/Express-App in bestehenden Umgebung bereitstellen, so wäre das perfekte Szenario:

  1. Pull aus dem Repo (erfolgt automatisch mit Maven build)
  2. npm install (das ist - das Herunterladen Abhängigkeiten von Knoten Paket Registry)
  3. Lauftests

ich habe versucht, ein NodeJS Paket für maven zu finden, aber um ehrlich zu sein - als node.js Entwickler ich fühle mich nicht sehr zuversichtlich, wenn es um die Wahl der kommt richtige Werkzeuge, da ich es nicht bin in der Lage, ein schlechtes Maven-Plugin von einem anständigen zu unterscheiden.

Vielleicht ist die Verwendung eines Shell-Plugins und das Aufrufen von npm install aus dem Terminal eine bessere Wahl?

Was ist Ihre Meinung?

Antwort

13

Ich denke, Sie können die Antwort in Grunt und die vielen verfügbaren Plugins finden.

Ich arbeite tatsächlich an einem Web-Projekt, wo die Client-Seite mit AngularJS gemacht wird. Trotzdem denke ich, die deployement Prozess teilweise auf Ihre Frage beantworten kann:

In Ihrem pom.xml, Sie so etwas tun:

<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> 
  • Der erste Teil ist die npm install Aufgabe: Herunterladen von Abhängigkeiten von Knotenpaket.

  • Der zweite Teil ist die bower install Aufgabe: downoading anderer Abhängigkeiten mit Bower (in meinem Fall, AngularJS, aber Sie könnten diesen Teil nicht brauchen)

  • Der dritte Teil ist der Grunt Release Teil: eine Grunt Aufgabe starten, dass beinhaltet Karma Unit-Tests.

Sie können Dokumentation über Grunthere finden. Es gibt viele verfügbare Plugins wie Karma Unit-Tests.

Ich hoffe, das hat dir geholfen.

+1

Hallo, danke für die Antwort. Tatsächlich benutze ich eine ziemlich große (ca. 300 Zeilen Code) grunt config. Was ich wissen wollte ist, wenn Maven Exec zusammen mit Grunt ist eine gute Übung, wenn es um Maven kommt. –

+0

Können Sie die Datei pom.xml auch mit dem ''-Block posten? –

+1

Nun, ich weiß nicht ob es eine gute Übung ist, aber das ist was ich tue ^^. Die pom.xml ist eher wie folgt: \t org.apache.maven.Plugins \t Maven-antrun-Plugin \t 1,5 \t \t \t \t \t \t Pear

21

Sie haben zwei Möglichkeiten bekommen:

Als hacky Lösung angegeben haben, aber immer noch machbar Sie könnten wie du selbst erwähnt hast, benutze etwas wie maven-antrun-plugin um npm mit maven auszuführen.

Alle Ansätze haben ihre Vor- und Nachteile, aber Frontend-Maven-Plugin scheint der am häufigsten verwendete Ansatz zu sein - aber es geht davon aus, dass Ihr ci-Server aus dem Internet beliebige Pakete herunterladen kann, während die "Hacky" -Lösung auch Arbeit, wenn die CI-Server überhaupt keine Verbindung zum Internet hat (neben die Repo zentralen maven Proxying)

+4

Keine Notwendigkeit, Ameisen hier zu verwenden, maven-exec-plugin ist genug, um npm zu starten. – user2189998

+0

Ja maven-exec-plugin ist in Ordnung, bis Sie versuchen werden, Ihre App auf einem PaaS wie Openshift bereitzustellen. Als Java-Maven-Anwendung würden Sie normalerweise ein auf dem Anwendungsserver jdk basierendes Bild verwenden, und diese Bilder werden nicht mit node.js installiert, so dass kein npm-Befehl verfügbar ist. –

5

ich habe npm Prozess Arbeit für meinen AngularJS 2 + Frühlings-Boot Anwendung von exec-maven-Plugin. Ich benutze nicht Bower und Grunzen, aber denke, du kannst es auch mit exec-maven-plugin machen, nachdem du dir das obige Beispiel von Pear angeschaut hast.

Unten ist mein pom.xml Beispiel für exec-maven-plugin. Meine App hat package.json und alle AngularJS .ts-Dateien befinden sich unter src/main/resources. Führen Sie daher npm vom Pfad aus. Ich betreibe npm für Abhängigkeiten installieren und npm Lauf tsc für .ts Umwandlung

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

Ein kleiner Hack auf diesem läuft Maven mit Windows auf Eclipse bauen oder Mac. Es ist perfekt auf Eclipse mit Linux oder sogar auch gut in Windows-Befehlsfenster. Wenn auf Eclipse mit Windows ausgeführt wird, kann es nicht verstehen, npm und beschweren über die Datei nicht finden. Sonderbare Sache ist npm funktioniert gut auf Windows-Befehlsfenster. Also löse ich den Hack Ich erstelle npm.bat Datei unter Systempfad. In meinem Fall werden nodejs und npm unter C: \ Program File \ nodejs installiert. Nach dem Einfügen dieser Batch-Datei. Alles funktioniert gut.

npm.bat

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

Für Mac, ich habe gleiches Problem auf Eclipse. Die Sache ist, dass nodejs und npm unter/usr/local/bin installiert sind. Um das Problem zu lösen, stelle ich den symbolischen Link/usr/local/bin/node und/usr/local/bin/npm auf unter/user/bin. Wie auch immer/usr/bin in der Sicherheitsrichtlinie geschützt ist, habe ich das nach dem Booten von der Wiederherstellungs-CD getan