Автоматическое сжатие JavaScript с помощью PowerShell - PullRequest
5 голосов
/ 20 сентября 2011

Я хочу написать скрипт, который будет принимать кучу файлов .js, сжимать их, а затем заменять старые на новые в той же папке.Я попробовал несколько вещей, но я постоянно сталкиваюсь с новыми проблемами, так что я подумал, что было бы лучше обратиться к людям, которые лучше меня понимают, и начать все заново.

Может ли кто-нибудь указать мне правильное направление?

Обновление: я использую набор команд, подобный следующему:

>Get-ChildItem c:\NewFolder\ -recurse |
&java -jar yuicompressor-2.4.6

Не похоже, что он хочет разрешить такого родаиспользование вывода хотя.Я уверен, что есть способ заставить эту работу работать, но, будучи довольно новым для PowerShell, я не слишком уверен, что пока могу сам разобраться в этом.

Обновление: использование предложенной командыСтрока ниже, я могу получить PowerShell, чтобы дать мне то, что, кажется, считывание из недавно сжатого .js, но он не заменит существующий файл сжатым или записать его в стандартный, который я считаю, втот же каталог в формате [имя_файла] .min.js.

Обновление: измененная версия предложенной команды, кажется, делает свое дело!

>Get-ChildItem c:\NewFolder\ -exclude jquery*.js,*min.js -recurse | %{java -jar yuicompressor-2.4.6.jar ($_.fullname) -o ($_.fullname)}

Однако, когда команда выполняется в PowerShellКак ни странно, я получаю сообщение об ошибке от PowerShell относительно команды Java ...

java.exe: В строке: 4 символа: 72 + Get-ChildItem c: \ Scripts \ -excludejquery * .js, * min.js -recurse |% {java <<<< -jar yuicompressor-2.4.6.jar ($ <em>.fullname) -o ($ .fullname)} + CategoryInfo: NotSpecified: (: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError Использование: java -jar yuicompressor-xyzjar [параметры] [входной файл]

Глобальные параметры -h, --help Отображает эту информацию --type Указывает тип входного файла --charset Чтение вводафайл с использованием --line-break Вставить разрыв строки после указанного номера столбца -v, --verbose Показать информационные сообщения и предупреждения -o Поместить вывод в.По умолчанию это стандартный вывод.Несколько файлов могут быть обработаны с использованием следующего синтаксиса: java -jar yuicompressor.jar -o '.css $: - min.css' * .css java -jar yuicompressor.jar -o '.js $: - min.js' *.js

Параметры JavaScript nomunge Только Minify, не запутывать preserve-semi Сохранять все точки с запятой disable-optimizations Отключить все микрооптимизации

Если входной файл не указан, по умолчанию используется stdin.В этом случае требуется опция 'type'.В противном случае опция 'type' требуется только в том случае, если расширение входного файла не является ни js, ни css.

Есть идеи, что PowerShell пытается мне сказать?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Попробуйте сделать так:

Get-ChildItem c:\NewFolder\ -recurse | %{java -jar yuicompressor-x.y.z.jar $_.fullname}

%{..} - это псевдоним для foreach-object. Вы получаете набор файлов из c: \ Newfolder (и его подкаталоги) и передаете каждый из них как объекты следующему компоненту в конвейере. Эта часть является внешним компонентом, который не поддерживает ни конвейерную обработку, ни объекты, вы оборачиваете его в foreach и также предоставляете файл в понятной форме - полное имя файла (которое включает путь).

2 голосов
/ 20 сентября 2011

Эта ветка может предложить вам несколько ответов. Что вы используете, чтобы свернуть и сжать библиотеки JavaScript?

Тем не менее, я считаю, что YUI-компрессор имеет отдельный исполняемый файл, который можно запустить из PowerShell.

1 голос
/ 10 мая 2017

Итак, я подумал, что наконец-то верну что-то этому сообществу. Я должен начать с того, что никогда раньше не использовал Powershell, и мне это очень не нравится. Я рад, что Bash теперь поставляется с окнами. Но у меня был небольшой забавный проект для друга, который работает на win-сервере, и мне нужно было написать что-нибудь для запуска после развертывания кода его приложения .net в его экземпляре ec2. Я знаю о дюжине лучших способов сделать это с помощью реальных инструментов сборки, но ... иногда вам нужен скрипт. Надеюсь, вы, ребята, найдете это полезным. Это требует, чтобы вы установили java и закрыли jar; Вы можете попробовать с другими инструментами минификации.

Мне нужно отдать должное Чейзу Флореллу в этом посте за то, что он начал в правильном направлении: Как создать версию файлов javascript и css как часть процесса сборки powershell?

##################################################################
# minimizeJS.ps1                                                 #
# This file removes all non-minified javascript resources        #
# and then updates all html and aspx pages to point to the       #
# minified js if they are not already.                           #
#                                                                #
# Version 1.0                                                    #
# Usage: minimizeJS.ps1 -debug true|false                        #
##################################################################
param($debug=$true)  #you can remove the =$true to force a user to specify
$maxFiles = Get-ChildItem -Path ./* -Include *.js -Exclude *.min.js, *.min.comp.js -Recurse 
$filesContainingResourceRefs = Get-ChildItem -Path ./* -Include *.html, *.aspx -Recurse 
$fileCollection = New-Object System.Collections.ArrayList

$closureJAR = 'C:\closure\compiler.jar'
$javaLocation = 'C:\Program Files\Java\jre1.8.0_131\bin\java.exe'

#Make sure debug flag is set one way or the other
if (!$debug){
  Write-Host "Debug has not been set.  Please use the -debug true|false argument."
  Exit
}elseif ($debug -eq $true){
  Write-host "Running with debug mode set to $debug."
}elseif ($debug -eq $false){
  Write-host "Running wiht debug mode set to $debug."
}else{
  Write-host "Debug has not been set properly.  Please use the -debug true|false argument."
  Exit
}

#First find everything we have a minified js version of, create an object of their names and paths, and delete the non-min file
Write-Host "Beginning minification of JS files.  Debug is $debug"
foreach ($file in $maxFiles)
    {
        $fileOld = $file.FullName
        $fileNew = $file.FullName.Replace(".js", ".min.js")
        if ($debug -eq $true){
          #Write-Host java -jar $closureJAR --js $fileOld --js_output_file $fileNew
          Write-Host "  ArgList is:  -jar  $closureJAR --js $fileOld --js_output_file $fileNew"
        }else{
            Write-Host "  Minifying: $fileOld"
            Start-Process -FilePath $javaLocation `
             -ArgumentList "-jar $closureJAR --js $fileOld --js_output_file $fileNew" `
             -RedirectStandardOutput '.\console.out' -RedirectStandardError '.\console.err'
        }
    }
Write-Host "End minification of JS files"


#Second find everything we have a minified js version of, create an object of their names and paths, and delete the non-min file
Write-Host "Beginning Removal of files...will display below"
$minFiles = Get-ChildItem -Path ./* -Filter *.min.js -Recurse 
foreach ($file in $minFiles)
    {
        #if ($file.FullName.Replace(".min.js", ".js") exists) {
        $private:nonMinifiedVersionFull = $file.FullName -replace ".min.js", ".js" #.ToString().Replace(".min.js", ".js")
        $private:nonMinifiedVersion = $file -Replace ".min.js", ".js" #.ToString().Replace(".min.js", ".js")
        Write-Host "  Removing: " $private:nonMinifiedVersion
        if ($debug -eq $false) {Remove-Item $private:nonMinifiedVersionFull -ErrorAction SilentlyContinue}

    $temp = New-Object System.Object
    $temp | Add-Member -MemberType NoteProperty -Name "minFileName" -Value $file.ToString()
    $temp | Add-Member -MemberType NoteProperty -Name "minFileFullName" -Value $file.FullName.ToString()
    $temp | Add-Member -MemberType NoteProperty -Name "maxFileName" -Value $private:nonMinifiedVersion.ToString()
    $temp | Add-Member -MemberType NoteProperty -Name "maxFileFullName" -Value $private:nonMinifiedVersionFull.ToString()
    $fileCollection.Add($temp) | Out-Null
    }
Write-Host "End Removal of Files"

if ($debug -eq $true) {
   Write-Host "The fileCollection is:"
   $fileCollection
   }

Write-Host "Beginning update of references to point to minified"
#now go through all the files that could reference them and update the references
foreach ($file2 in $filesContainingResourceRefs)
    {
        $private:file = $file2.FullName

            $fixedContent = [System.IO.File]::ReadAllText($private:file)

            #Now loop through all the min and max files in the collection
           foreach ($line in $fileCollection) {

                    $strFind    = $line.maxFileName.ToString()
                    $strReplace = $line.minFileName.ToString()

                    $fixedContent = $fixedContent.replace($strFind, $strReplace)

            }            
            if ($debug -eq $false) {[System.IO.File]::WriteAllText($private:file, $fixedContent)}


           Write-Host "  Replaced non-minified references in: " $private:file

    }

Write-Host "End update of references to point to minified"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...