Node.js 使用Gradle构建NodeJS

Node.js 使用Gradle构建NodeJS,node.js,gradle,Node.js,Gradle,我对格拉德尔很陌生。我昨天开始读这方面的书。我找到了一个构建节点应用程序的build.gradle示例。我对文件的内容有点困惑。我不确定哪些是保留词或预定义词。其中一个字符串是节点。它没有在什么地方使用过,但我发现它是节点插件所需要的 buildscript { repositories { mavenCentral() maven { url 'https://plugins.gradle.

我对格拉德尔很陌生。我昨天开始读这方面的书。我找到了一个构建节点应用程序的build.gradle示例。我对文件的内容有点困惑。我不确定哪些是保留词或预定义词。其中一个字符串是
节点
。它没有在什么地方使用过,但我发现它是节点插件所需要的

    buildscript {
        repositories {
            mavenCentral()
            maven {
                url 'https://plugins.gradle.org/m2/'
            }
        }

        dependencies {
            classpath 'com.moowork.gradle:gradle-node-plugin:1.2.0'
        }
    }

    apply plugin: 'base'
    apply plugin: 'com.moowork.node' // gradle-node-plugin

    node {
        /* gradle-node-plugin configuration
        https://github.com/srs/gradle-node-plugin/blob/master/docs/node.md

        Task name pattern:
        ./gradlew npm_<command> Executes an NPM command.
        */

        // Version of node to use.
        version = '10.14.1'

        // Version of npm to use.
        npmVersion = '6.4.1'

        // If true, it will download node using above parameters.
        // If false, it will try to use globally installed node.
        download = true
    }

    npm_run_build {
        // make sure the build task is executed only when appropriate files change
        inputs.files fileTree('public')
        inputs.files fileTree('src')

        // 'node_modules' appeared not reliable for dependency change detection (the task was rerun without changes)
        // though 'package.json' and 'package-lock.json' should be enough anyway
        inputs.file 'package.json'
        inputs.file 'package-lock.json'

        outputs.dir 'build'
    }

    // pack output of the build into JAR file
    task packageNpmApp(type: Zip) {
        dependsOn npm_run_build
        baseName 'npm-app'
        extension 'jar'
        destinationDir file("${projectDir}/build_packageNpmApp")
        from('build') {
            // optional path under which output will be visible in Java classpath, e.g. static resources path
            into 'static'
        }
    }

    // declare a dedicated scope for publishing the packaged JAR
    configurations {
        npmResources
    }

    configurations.default.extendsFrom(configurations.npmResources)

    // expose the artifact created by the packaging task
    artifacts {
        npmResources(packageNpmApp.archivePath) {
            builtBy packageNpmApp
            type 'jar'
        }
    }

    assemble.dependsOn packageNpmApp

    String testsExecutedMarkerName = "${projectDir}/.tests.executed"

    task test(type: NpmTask) {
        dependsOn assemble

        // force Jest test runner to execute tests once and finish the process instead of starting watch mode
        environment CI: 'true'

        args = ['run', 'test']

        inputs.files fileTree('src')
        inputs.file 'package.json'
        inputs.file 'package-lock.json'

        // allows easy triggering re-tests
        doLast {
            new File(testsExecutedMarkerName).text = 'delete this file to force re-execution JavaScript tests'
        }
        outputs.file testsExecutedMarkerName
    }

    check.dependsOn test

    clean {
        delete packageNpmApp.archivePath
        delete testsExecutedMarkerName
    }
buildscript{
存储库{
mavenCentral()
马文{
url'https://plugins.gradle.org/m2/'
}
}
依赖关系{
类路径'com.moork.gradle:gradle节点插件:1.2.0'
}
}
应用插件:“基本”
应用插件:“com.moork.node”//gradle节点插件
节点{
/*gradle节点插件配置
https://github.com/srs/gradle-node-plugin/blob/master/docs/node.md
任务名称模式:
./gradlew npm_uu执行npm命令。
*/
//要使用的节点的版本。
版本='10.14.1'
//要使用的npm版本。
npmVersion='6.4.1'
//如果为true,它将使用上述参数下载节点。
//如果为false,它将尝试使用全局安装的节点。
下载=真
}
npm_运行_构建{
//确保仅当适当的文件更改时才执行生成任务
inputs.files文件树('public')
inputs.files文件树('src')
//“node_modules”对于依赖项更改检测似乎不可靠(任务在没有更改的情况下重新运行)
//尽管“package.json”和“package lock.json”应该足够了
inputs.file“package.json”
inputs.file“package lock.json”
outputs.dir“build”
}
//将构建的输出打包到JAR文件中
任务包pmapp(类型:Zip){
dependsOn npm\u运行\u构建
baseName“npm应用程序”
扩展名“jar”
destinationDir文件(“${projectDir}/build\u packageNpmApp”)
从('build'){
//可选路径,在该路径下输出将在Java类路径中可见,例如静态资源路径
进入“静态”
}
}
//声明用于发布打包JAR的专用范围
配置{
NPM资源
}
configurations.default.extendsFrom(configurations.npmResources)
//公开打包任务创建的工件
人工制品{
npmResources(PackagenPApp.archivePath){
内置程序包PMApp
键入“jar”
}
}
assembly.dependsOn packageNpmApp
字符串testsExecutedMarkerName=“${projectDir}/.tests.executed”
任务测试(类型:NpmTask){
德彭森装配
//强制Jest测试运行程序执行一次测试并完成该过程,而不是启动监视模式
环境CI:“真实”
args=['run','test']
inputs.files文件树('src')
inputs.file“package.json”
inputs.file“package lock.json”
//允许轻松触发重新测试
多拉斯特{
新文件(testsExecutedMarkerName).text='删除此文件以强制重新执行JavaScript测试'
}
outputs.file testsExecutedMarkerName
}
check.dependsOn检验
干净的{
删除packageNpmApp.archivePath
删除testsExecutedMarkerName
}

另外,build.gradle是如何解析的?我还想知道它是如何神奇地下载node和npm工具的。

这是一个非常概括的概要:

  • Gradle的目标是对开发人员隐藏逻辑
  • 大多数
    *.gradle
    文件包含配置块(
    闭包
    ),用于指定逻辑应如何运行
  • 插件用更多可配置的逻辑扩充gradle
  • 此外,“约定优先于配置”是gradle及其插件中强调的一种实践,提供合理的默认值以最小化开发人员的配置工作
  • 插件是通过
    节点
    扩展块配置的
  • 是gradle允许插件向标准gradle模型添加更多“保留”字的方法
  • download=true
    配置告诉插件在项目的根目录中下载节点(
    version='10.14.1'
    )和nmp(
    npmVersion='6.4.1'
    )(除非您也覆盖其默认值)
  • 这些工具的下载将在调用插件的任何任务时进行

希望这有帮助。

在您的代码片段中,只有
true
是关键字,其他内容是来自Gradle或Node JS插件的方法或getter:

  • apply插件:…
    是来自
    org.gradle.api.Project.apply(java.util.Map)
  • 节点
    是Gradle自动生成的方法,带有签名
    无效节点(闭包)
    (接受代码块的方法),请参阅
  • node{version=…}
    -
    version
    npmVersion
    是来自
    NodeExtension
    类的字段
  • 其他类似的东西,一切都是一个方法或一个字段。如果使用IntelliJ,请使用Ctrl+鼠标单击导航到原始方法/字段声明

这是一个相当宽泛的问题,我建议您将其缩小到一个特定的问题。您的
build.gradle
脚本是用Groovy编写的。
节点
关键字实际上不是一个关键字,它在渐变术语中是一个“任务”,它由您在问题中引用的依赖项提供。这是一个非常复杂的学习gradle的例子,你可能想退一步,先学习一些基本的gradle教程。明白了。我不知道我发现了一个复杂的例子。谢谢。我基本上同意@JakeHolzinger,但是示例中的
node
不是任务,而是定义
'com.moowork.node'
插件总体设置的扩展。这实际上显示了新用户面临的主要问题之一。它需要对b语言有广泛的了解