gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:28:16 29 4
gpt4 key购买 nike

当一个项目需要两种第三方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/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com