如何告诉gradle在构建项目中安装npm?

时间:2017-12-06 13:06:29

标签: java angular gradle npm-install

我对java web应用程序的角度4 UI仅取决于以下几个捆绑包。我从webapps root运行以下命令。应用程序正常。我想知道最好的做法,因为我是角色的新手。

npm install rxjs
npm install @angular/core@4.4.6 @angular/common@4.4.6 @angular/compiler@4.4.6 @angular/platform-browser@4.4.6 @angular/platform-browser-dynamic@4.4.6 @angular/router@4.4.6 @angular/forms@4.4.6 --save
npm install typescript@2.4.2 --save
npm install plugin-typescript@5.2.7 --save

我正在引用systemjs.config.js中已安装的捆绑包,如下所示:

paths: {
       'npm:' : 'node_modules/'
},
map: {
       '@angular/core' : 'npm:@angular/core/bundles/core.umd.js'
       .
       .
}

查询:

  1. 应用不应该很重,不能在node_modules中包含整个war
  2. 如果我将node_modules保留在项目根目录而不是webapps中,我该如何从systemjs.config.js
  3. 中引用它
  4. 我只想要那些捆绑包而不是运行npm install @angular/cli
  5. 时下载的大文件堆栈
  6. 如果我们可以使用全局node_modules,那么如何从systemjs.config.js引用它(我更喜欢将其保留在项目中,而不是使用不同版本来干扰服务器中的其他应用程序)
  7. 最后,我应该在build.gradle中包含哪些内容,以便在gradle构建时下载所需的包

2 个答案:

答案 0 :(得分:3)

正如@Oliver Charlesworth所说,Gradle有其局限性,但你可以创建一个自定义的gradle任务。

示例:

task npmInstall(type: Exec) {
    workingDir 'src/main/webapp'
    commandLine 'npm', 'install'
}

将构建依赖项添加到war构建步骤

war {
    dependsOn npmBuild
}

答案 1 :(得分:1)

正如Tim Hovius所说:您可以创建自己的任务。

如果您不希望它一直执行,则可以添加OnlyIf子句。

(摘自官方文档:https://docs.gradle.org/current/dsl/org.gradle.api.Task.html#org.gradle.api.Task:onlyIf(groovy.lang.Closure)

myTask.onlyIf(new Spec<Task>() {
    boolean isSatisfiedBy(Task task) {
        return isProductionEnvironment();
    }
});

OR

您可以使用标准Groovy更智能地编写任务。 例如:

task doSomething {
    doLast {
        def file = new File("dummy.txt")

        if (file.exists()) {
            project.exec {
                commandLine 'someCommand', 'parameter'
            }
        }
    }
}

OR

例如在您的build.gradle中

task doSomething {
   doLast {
        ...
   }
}

doSomething.enabled = (some condition goes here)