仅通过 gradle 下载节点 8.17.0 如果节点未安装在系统中

Download node 8.17.0 via gradle ONLY If the node is not installed in the system

build.gradle中的代码:

node {
    version = '8.17.0'
    download = true
}

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

我在下面添加了任务以获取已安装的节点版本并使 npm 任务依赖于该任务,并使用 stdout 值来决定是否下载节点,但节点块包含 'download = true'在一切之前执行并尝试每次下载节点。

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

A 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 中,并在 [=26] 期间在 printNodeVersion 任务中打印值=]执行次。

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