javascript - Gradle 1.8错误地报告了任务是最新的

标签 javascript gradle

当一个项目需要两种第三方JavaScript依赖关系时,这是一种很常见的情况。出于开发目的,使用了非最小版本的JavaScript文件,而部署方案通常仅包括最小版本(* .min.js)。
假设所有依赖项的(最小和非最小)版本都在“repo”文件夹中。此外,“main”文件有2个版本,一个使用最小化的deps“main.min.js”,而“main.js”使用非最小化的文件。假设两个“主”文件都可以通过声明所有依赖项的“deps.json”以某种方式生成。文件结构如下:

public/
    lib/
repo/
        angular/
            ...
        angular-resource/
            ...
        angular-route/
            ...
build.gradle
deps.json
main.js
main.min.js
public文件夹是所有输出文件应出现的位置,因此我编写了相应的build.gradle文件:
task createMain {
    inputs.file 'deps.json'
    // TODO: read deps.json and create  main.min.js and './main.js
    outputs.file 'main.min.js'
    outputs.file 'main.js'
}

task copyMain(type: Copy, dependsOn: createMain) {
    from('.') {
        include 'main.js'
    }
    into('public')
}

task copyMainForDeploy(type: Copy, dependsOn: createMain) {
    from('.') {
        include 'main.min.js'
    }
    rename('main.min.js','main.js')
    into('public')
}

task installJSDeps(type: Copy, dependsOn: copyMain){
    from('repo')
    into('public/lib')
    outputs.dir 'public/lib'
    inputs.file 'deps.json'
}

task installJSDepsForDeploy(type: Copy, dependsOn: copyMainForDeploy){
    from('repo'){
        include '**/*.min.js'
    }
    into('public/lib')
    outputs.dir 'public/lib'
    inputs.file 'deps.json'


    doFirst {
        //clean up any existing files before copying new ones
        FileTree tree = fileTree (dir: "public/lib");  
        delete(tree)
    }
}

我希望实现的目标是:如果我将installJSDepsForDeploy命名为最小,则出现在public/lib中;如果我将其命名为installJSDeps,则所有文件都将出现在public/lib中(除了被复制/重命名的main文件)。
发生了以下情况:
$ gradle installJSDepsForDeploy
:createMain UP-TO-DATE
:copyMainForDeploy
:installJSDepsForDeploy

BUILD SUCCESSFUL

Total time: 3.698 secs

$ gradle installJSDeps
:createMain UP-TO-DATE
:copyMain
:installJSDeps

BUILD SUCCESSFUL

Total time: 2.484 secs

$ gradle installJSDepsForDeploy
:createMain UP-TO-DATE
:copyMainForDeploy
:installJSDepsForDeploy UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.41 secs

第二次报告:installJSDepsForDeploy UP-TO-DATE,这是不希望的,据我所知,这是不正确的。

我想念什么吗?
提前致谢,
窗扇

编辑:

考虑到下面的注释,更正确的build.gradle文件将是:
task createMain {
    inputs.file 'deps.json'
    // ASSUME: read deps.json and create  main.min.js and './main.js
    outputs.file 'main.min.js'
    outputs.file 'main.js'
}

task copyMain(type: Copy, dependsOn: createMain) {
    from('.') {
        include 'main.js'
    }
    into('public')
}

task copyMainForDeploy(type: Copy, dependsOn: createMain) {
    from('.') {
        include 'main.min.js'
    }
    rename('main.min.js','main.js')
    into('public')
}

task fetchJSDeps {
    // ASSUME: reads `deps.json` and fetches
    // all the deps into `repo` folder
    outputs.dir 'repo'
    inputs.file 'deps.json'        
}

task installJSDeps(type: Copy, dependsOn: ['copyMain','fetchJSDeps']){
    from('repo')
    into('public/lib')
    outputs.dir 'public/lib'
    inputs.file 'deps.json'
}

task installJSDepsForDeploy(type: Copy, dependsOn: ['copyMainForDeploy','fetchJSDeps']){
    from('repo'){
        include '**/*.min.js'
    }
    into('public/lib')
    outputs.dir 'public/lib'
    inputs.file 'deps.json'


    doFirst {
        //clean up any existing files before copying new ones
        FileTree tree = fileTree (dir: "public/lib");  
        delete(tree)
    }
}

相应的输出仍然是:
$ gradle installJSDepsForDeploy
:createMain UP-TO-DATE
:copyMainForDeploy
:fetchJSDeps UP-TO-DATE
:installJSDepsForDeploy

BUILD SUCCESSFUL

Total time: 2.769 secs

$ gradle installJSDeps
:createMain UP-TO-DATE
:copyMain
:fetchJSDeps UP-TO-DATE
:installJSDeps

BUILD SUCCESSFUL

Total time: 2.519 secs

$ gradle installJSDepsForDeploy
:createMain UP-TO-DATE
:copyMainForDeploy
:fetchJSDeps UP-TO-DATE
:installJSDepsForDeploy UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.376 secs

更新:

我尝试了许多不同的设置,但在我看来,Gradle不支持此类任务。本质上,我希望从以下位置复制taskA:
/repo/**/*.js
/repo/**/*min.js
/repo/**/*min.js.map
/repo/**/*.css
/repo/**/*.md

至:
/public/lib/**/*min.js
/public/lib/**/*min.js.map

我想从中复制taskB:
/repo/**/*.js
/repo/**/*min.js
/repo/**/*min.js.map
/repo/**/*css
/repo/**/*.md

至:
/public/lib/**/*.js
/public/lib/**/*.css
/public/lib/**/*.md

任务不相互依赖,实际上这是这里的重点。此外,我希望TaskA不复制TaskB正在复制的文件。这两个任务都需要确保在完成后不存在其他任务要复制的文件。

基本上,在运行gradle taskA之后,public/lib应该仅包含:
/public/lib/**/*min.js
/public/lib/**/*min.js.map

并不是:
/public/lib/**/*.js
/public/lib/**/*.css
/public/lib/**/*.md

运行`gradle taskB'之后,结果应该相反。
可以在Gradle中做到吗?

提前致谢,
窗扇

最佳答案

看代码,对我来说不清楚你在这里试图做什么。一个最小的例子会有所帮助。

一些一般性提示(由于太长,我无法对此发表评论):

  • createMain不执行任何操作,这意味着copyMain任务将无法复制任何内容(除非您暂时手动放置main.jsmain.min.js文件)。
  • copyMaincopyMainForDeploy在相同的位置创建相同的文件,这意味着它们将不断覆盖彼此的输出,从而使其他任务过时。
  • 任务依赖项没有意义,因为installJSDeps不会消耗copyMain产生的任何东西(即,两个任务之间没有语义依赖项)。
  • 我不明白为什么deps.jsonCopy任务的输入。此外,像Copy这样的任务类型会根据其配置方式自动声明其输入和输出(例如frominto),这意味着不必在构建脚本中声明它们。
  • 应该使用from('.') { include 'foo' }代替from 'foo'
  • 应该使用Sync任务(它的配置方式与Copy完全相同),而不是在复制之前删除目标目录的内容。
  • 关于javascript - Gradle 1.8错误地报告了任务是最新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572140/

    相关文章:

    android - 找不到与给定名称 : attr 'android:actionModeShareDrawable' 匹配的资源

    XML Beans 的 Gradle 插件

    amazon-web-services - CodeBuild无法在Gradle脚本中获取AWS凭证

    javascript - 在 css 中将一个图像重叠在另一个图像上

    javascript - 使用正确的后备路由结构从 Nodejs 中的异步调用传递数据的最佳实践

    javascript - 如何记录来自 Camel 调用的 Javascript 的消息?

    java - 包含 zuul 的 gradle 依赖项时出现问题

    android - 在 Android studio 2.3.3 中更新到 gradle 3.2.1 不起作用

    javascript - 如何将多个函数组合成一个函数?

    javascript - 是否可以在 hapi 中定义全局基本路径