2016-05-02 2 views
1

Я пытаюсь минимизировать все js-файлы в моем приложении. Я использовал gradle-js-plugin. Я смог минимизировать один файл, используя это. Но я хочу, чтобы все мои js-файлы были уменьшены. Вот что я пробовал. В конце концов это может показаться очень глупым, но я новичок в написании чего-то с градиентом.Gradle minify все 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' 
    } 
} 
} 

Проблема, я не могу вызвать minifyJs задачу из внутренней minifyAll. Я пробовал несколько вещей, включая execute. Заранее спасибо.

ответ

3

Edit: теперь производит свернутый файл для каждого файла JS

Я использую Gradle 2.12 с несколькими файлами JS в src/main/webapp/resources

Учитывая этот 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 правило, когда речь идет о Gradle: Инициализация, фаза конфигурации, фаза выполнения. В этом случае динамические задачи определяются на этапе конфигурации (то есть код, который свободно плавает вне определения задачи). Во время фазы выполнения myMinify вызывает свои зависимости, в которых выполняется работа.

+0

Thanks Michael. Но я хочу, чтобы все файлы были уменьшены отдельно. Поскольку мое приложение не одностраничное приложение, ничто не мешает мне в одном файле. –

+0

Моя ошибка ... Я рассмотрю сегодня и, если возможно, обновить свой ответ. –

+0

Я изменил ответ, чтобы создать свернутый файл для каждого файла в исходной исходной папке (он должен действительно проверить расширение файла, чтобы убедиться, что это JS, CSS и т. Д.). –

2

Выше ответа Майкла помогли нам решить проблему. Мы придумали несколько иной подход. Я думал, что это поможет кому-нибудь, если я опубликую его.

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.") 
} 

Примечание: Если это не сработает, попробуйте добавить плагин для закрытия Google вручную для вас.

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, замените последний file на CommandLine в file - '.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. Хайрул: Извинения. Теперь лучше ? – user3279692