当一个项目需要两种第三方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.js
和main.min.js
文件)。 copyMain
和copyMainForDeploy
在相同的位置创建相同的文件,这意味着它们将不断覆盖彼此的输出,从而使其他任务过时。 installJSDeps
不会消耗copyMain
产生的任何东西(即,两个任务之间没有语义依赖项)。 deps.json
是Copy
任务的输入。此外,像Copy
这样的任务类型会根据其配置方式自动声明其输入和输出(例如from
和into
),这意味着不必在构建脚本中声明它们。 from('.') { include 'foo' }
代替from 'foo'
。 Sync
任务(它的配置方式与Copy
完全相同),而不是在复制之前删除目标目录的内容。 关于javascript - Gradle 1.8错误地报告了任务是最新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572140/