【问题标题】:Download node 8.17.0 via gradle ONLY If the node is not installed in the system仅通过 gradle 下载节点 8.17.0 如果系统中未安装该节点
【发布时间】:2020-05-09 20:17:47
【问题描述】:

build.gradle 中的代码:

node {
    version = '8.17.0'
    download = true
}

plugins{
    id "com.moowork.node" version "1.3.1"
}

我添加了下面的任务来获取已安装的节点版本,并使 npm 任务依赖于该任务,并使用标准输出值来决定是否下载节点,但包含“下载=真”的节点块被执行在一切之前,并尝试每次下载节点。

task execute(type: Exec) {
    commandLine 'node', '-v'
    standardOutput = new ByteArrayOutputStream()
    Set s = standardOutput.collect()
    ext.stdout =  {return s.getAt(0).toString()}
}

【问题讨论】:

    标签: gradle build.gradle gradle-plugin gradlew


    【解决方案1】:

    Gradle 构建具有 three distinct phases:初始化、配置和执行。 node { download = true } 在配置阶段执行,而execute 任务的主体在执行阶段执行。

    要在配置阶段计算结果,您应该将 execute 任务更改为普通的 Groovy 函数:

    bash-3.2$ cat build.gradle
    ext {
      nodeVersion = getNodeVersion()
    }
    
    def getNodeVersion() {
      def baos = new ByteArrayOutputStream()
      def execResult = project.exec {
        commandLine 'node', '-v'
        standardOutput = baos
      }
      return baos.toString();
    }
    
    task printNodeVersion {
      doLast {
        println(project.nodeVersion)
      }
    }
    bash-3.2$ ./gradlew :printNodeVersion
    
    > Task :printNodeVersion
    v13.12.0
    
    
    BUILD SUCCESSFUL in 566ms
    1 actionable task: 1 executed
    

    这里我在配置期间将节点版本存储在扩展对象ext中,并在执行期间打印printNodeVersion任务中的值。 p>

    对于您的用例,您应该在配置期间调用该函数并检查返回值是否等于“8.17.0”。如果是,则 node 二进制文件的版本为 8.17.0,否则,节点二进制文件的版本不同(或者可能缺少节点)。

    【讨论】:

    • 是的,这对我有用。谢谢。还有一件事是我们可以做任何其他事情来比较版本。假设我想在我的项目中使用 8.17.0 并且安装的版本是 1.2.3(较低版本)。在这种情况下,我想下载所需的版本。那么如何在不编写 java/groovy 逻辑的情况下进行比较。
    • 如果未安装节点并且运行上述代码,我们会在控制台中收到错误:评估根项目“ui-service”时出现问题。 > 启动进程 'command 'node'' 出现问题
    • 您可以使用类似的代码运行which node,在运行node -v之前检查节点二进制文件是否存在。为了比较版本,您必须编写一些 Java/Groovy 逻辑(或依赖一些为您执行此操作的第三方代码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多