2016-05-02 77 views
1

我正试图缩小我应用中的所有js文件。我正在使用gradle-js-plugin。我能够使用它来缩小单个文件。但我希望我的所有js文件都被缩小。这是我的尝试。最终看起来很愚蠢,但我是用gradle写一些东西的新手。Gradle全部缩小javascript

plugins { 
id "com.eriwen.gradle.js" version "2.12.0" 
} 

task minifyAll << { 

FileTree tree = fileTree('src/main/webapp/resourcesMinified') { 
    include '**/*.js' 
    exclude '**/*.css' 
    exclude '**/*.less' 
    exclude '**/*.sass' 
} 

tree.each { file -> 
    def path = file.path 

    minifyJs { 
    println path 
    source = path 
    dest = path 
    closure { 
    warningLevel = 'QUIET' 
    } 
} 
} 

问题是我无法从内部minifyAll调用minifyJs任务。我尝试了几件东西,包括execute。先谢谢了。

回答

3

编辑:现在生产的src/main/webapp/resources

每个JS文件

我使用的摇篮2.12与几个JS文件最小化的文件,鉴于这种build.gradle文件:

plugins { 
    id "com.eriwen.gradle.js" version "2.12.0" 
} 

import com.eriwen.gradle.js.tasks.MinifyJsTask 

def srcDir = "src/main/webapp/resources" 
def dynamicTaskNames = [] 
def dynamicTaskIndex = 1 

new File(srcDir).eachFile { def file -> 
    def dynamicTaskName = "taskMinify${dynamicTaskIndex}" 

    task "${dynamicTaskName}"(type: MinifyJsTask) { 
     source = file.absolutePath 
     dest = "${buildDir}/min.${file.name}" 
     closure { warningLevel = 'QUIET' } 
    } 

    dynamicTaskNames << dynamicTaskName 
    dynamicTaskIndex++  
} 

task myMinify(dependsOn: dynamicTaskNames) << { 
    println ("done.") 
} 

的以下作品适合我:

$ gradle myMinify 

myMinify任务依赖于几个动态任务,它们为每个文件执行minifyJs任务。例如StringUtils.js将生成build/min.StringUtils.js

我想摇篮时使用ICE规则:初始化阶段,配置阶段,执行阶段。在这种情况下,动态任务是在配置阶段定义的(即在任务定义之外自由浮动的代码)。在执行阶段,myMinify调用执行工作的依赖关系。

+0

谢谢迈克尔。但是我希望所有文件都被分别缩小。由于我的应用程序不是一个单一的页面应用程序,所有缩小到一个单一的文件对我来说是无效的。 –

+0

我的错误...我今天会看看,如果可能的话更新我的答案。 –

+0

我已经更改了原始源文件夹中每个文件产生最小化文件的答案(它应该确实检查文件扩展名以确保它是JS,CSS等)。 –

2

以上Michael的回答帮助我们解决了这个问题。我们想出了稍微不同的方法。如果我发布它,我认为它会对一些人有所帮助。

def dynamicTaskNames = [] 
def dynamicTaskIndex = 1 

FileTree tree = fileTree('/home/path/to/app/src/main/webapp/resources') { 
    include '**/*.js' 
    exclude '**/*.css' 
    exclude '**/*.less' 
    exclude '**/*.sass' 
} 

tree.each{file -> def dynamicTaskName = "taskMinify${dynamicTaskIndex}" 

    task "${dynamicTaskName}"(type: MinifyJsTask){ 
     source = file.absolutePath; 
     dest = "${buildDir}/min.${file.name}" 
     closure.compilationLevel='ADVANCED_OPTIMIZATIONS' 
     closure { 
      warningLevel = "QUIET" 
      compilerOptions.languageIn = "ECMASCRIPT5" 
      } 
    } 

    dynamicTaskNames << dynamicTaskName 
    dynamicTaskIndex++ 
} 



task callMinify(dependsOn: dynamicTaskNames) <<{ 
    println("done.") 
} 

注意:如果这不起作用,请尝试手动添加谷歌封闭插件到您的脚本。

3

这可能是简单的:

plugins { 
    id 'com.eriwen.gradle.js' version '2.14.1' 
} 

import com.eriwen.gradle.js.tasks.MinifyJsTask 
task minifyJS 
minifyJS.doLast { 
    fileTree('your files dir').eachWithIndex { file, index -> 
    def dynamicTask = "minify$index" 
    task "${dynamicTask}" (type: MinifyJsTask) { 
     source = file 
     dest = file 
    } 
    tasks."$dynamicTask".execute() 
    } 
} 
  • 使用eachWithIndex而不是反
  • 执行动态任务里面的任务

备选答案

您还可以使用uglifyjs为这个任务。 (我正在使用这种方式来处理我的脚本,因为这种方式比gradle-js-plugin更容易处理更复杂的情况。)

先决条件:

  • 的NodeJS
  • uglifyjs
plugins { 
    id 'com.github.jlouns.cpe' version '0.5.0' 
} 

task minifyJS 
minifyJS.doLast { 
    fileTree('your files dir').include('**/*.js').eachWithIndex { file, index -> 
    def dynamicTask = 'minify' + index 
    task "${dynamicTask}" (type: CrossPlatformExec) { 
     commandLine uglifyjs, file, '-c', '-m', '-o', file 
    } 
    tasks."${dynamicTask}".execute() 
    } 
} 
  • CrossPlatformExec有助于独立执行这一任务的平台。如果您只使用一个平台,则可以将其更改为Exec任务类型,并删除plugins块。
  • -c选项使压缩
  • -m选项可以重整
  • -o选项指定输出文件。本示例覆盖现有文件。如果你想改变输出文件名.min.js,取代在命令行的最后filefile - '.js' + '.min.js'
-2

的重要组成部分是创建的每一个文件一个单独的任务。这就是这个插件的工作原理。现在,你不知道你有多少文件,所以你必须编写一个小代码来创建与文件一样多的任务。例如: -

javascript.source { 
custom { 
    js { 
    srcDir "" 
    include "**/*.js" 
    exclude "**/*.min.js" 
    } 
} 
} 


javascript.source.custom.js.files.eachWithIndex {fileSrc, idx -> 
def dynName = "jsMinifyTask_${idx}" 

task "${dynName}"(type:MinifyJsTask) { 

dependsOn createdir 

def name = fileSrc.name.replace(".js", "") 

source = fileSrc.absolutePath 
dest = fileSrc.getParentFile().absolutePath + "/" + name + ".min.js" 
closure { 
    warningLevel = 'QUIET' 
    compilationLevel = 'WHITESPACE_ONLY' 
    compilerOptions.languageIn = "ECMASCRIPT5" 
    } 
} 
} 

一旦你完成了这个,写一个包装任务来执行所有这些。例如: -

task minify() { 
    tasks.findAll {Task task -> 
    if(task.name.startsWith("jsMinifyTask_")) { 
     task.execute() 
     } 
    } 
} 

而你完成了。

我写了一个Gradle脚本在ThreadPoolExecutor上执行此操作,以获得更快的响应。检查出来: -

https://www.concurrenthashmap.com/blog/2017/10/08/gradle-tasks-for-javascript-and-css-minification-and-combination-using-threadpoolexecutor-for-parallel-execution/

+1

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/17562553) –

+0

MD。 Khairul:道歉。现在好多了 ? – user3279692