2011-09-20 22 views
5

के साथ स्वचालित जावास्क्रिप्ट संपीड़न मैं एक स्क्रिप्ट लिखना चाहता हूं जो .js फ़ाइलों का एक गुच्छा लेगा, उन्हें संपीड़ित करेगा, और फिर पुराने फ़ोल्डर को उसी फ़ोल्डर में नए लोगों के साथ प्रतिस्थापित करेगा। मैंने कुछ चीजों की कोशिश की है, लेकिन मुझे खुद को लगातार नई समस्याओं का सामना करना पड़ रहा है, इसलिए मैंने सोचा कि उन लोगों के पास जाना सबसे अच्छा होगा जिनके पास बेहतर समझ है और मैं ताजा शुरू करता हूं।पावरशेल

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

अद्यतन: मैं इस के समान आदेशों का एक सेट का उपयोग कर रहा:

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

यह प्रतीत नहीं होता है यह उत्पादन उपयोग के इन प्रकार की अनुमति के लिए हालांकि चाहता है की तरह। मुझे यकीन है कि यह काम करने का एक तरीका है, लेकिन पावरशेल के लिए अभी भी काफी नया है, मुझे पूरा भरोसा नहीं है कि मैं इसे अभी तक अपने आप समझ सकता हूं।

अद्यतन: नीचे दिए गए सुझाए गए कमांड स्ट्रिंग का उपयोग करके, मुझे पावरहेल मिल सकता है जो मुझे एक नए संपीड़ित .js के पढ़ने के लिए प्रतीत होता है लेकिन यह मौजूदा फ़ाइल को संपीड़ित एक के साथ प्रतिस्थापित नहीं करेगा या इसे लिख नहीं पाएगा मानक आउटपुट के लिए जो मुझे लगता है कि [filename] .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.exe: 4 चार: लाइन में: 72 + Get-ChildItem c: \ स्क्रिप्ट \-exque jquery * .js, * min.js -recurse | % {जावा < < < < जार yuicompressor-2.4.6.jar ($ .fullname) -ओ ($ .fullname)} + CategoryInfo: NotSpecified: (: स्ट्रिंग) [], RemoteException + FullyQualifiedErrorId: NativeCommandError उपयोग: जावा जार yuicompressor-xyzjar [विकल्प] [इनपुट फ़ाइल]

वैश्विक विकल्प -h, --help प्रदर्शित करता है इस जानकारी --type इनपुट फ़ाइल का प्रकार निर्दिष्ट पढ़ें --charset का उपयोग कर इनपुट फ़ाइल --लाइन-ब्रेक निर्दिष्ट कॉलम संख्या -v के बाद एक लाइन ब्रेक डालें, --verbos ई सूचनात्मक संदेश और चेतावनियां प्रदर्शित करें -o आउटपुट को अंदर रखें। Stdout के लिए डिफ़ॉल्ट। एकाधिक सिंटैक्स का उपयोग करके एकाधिक फ़ाइलों को संसाधित किया जा सकता है: जावा -jar yuicompressor.jar -o '.css $: - min.css' * .css जावा -जर yuicompressor.jar -o '.js $: - min। js '*

जावास्क्रिप्ट विकल्प nomunge कम करें केवल, अंधेरा नहीं है की रक्षा-अर्ध, चूक stdin को बचाना सभी अर्धविराम अक्षम-अनुकूलन सभी सूक्ष्म अनुकूलन अक्षम

कोई इनपुट फ़ाइल निर्दिष्ट है, तो यह .js। इस मामले में, 'प्रकार' विकल्प आवश्यक है। अन्यथा, 'प्रकार' विकल्प केवल तभी आवश्यक है जब इनपुट फ़ाइल एक्सटेंशन न तो 'js' और न ही 'css' है।

कोई विचार क्या PowerShell मुझे बताने की कोशिश कर रहा है?

उत्तर

5

इस तरह करने का प्रयास करें:

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

%{..}foreach-object के लिए अन्य नाम है। आपको सी: \ न्यूफोल्डर (और इसके उपनिवेशियों) से फ़ाइलों का एक सेट मिलता है और इनमें से प्रत्येक को पाइपलाइन में अगले घटक के ऑब्जेक्ट्स के रूप में पास किया जाता है। यह हिस्सा एक बाहरी घटक है जो न तो पाइपलाइनिंग और न ही ऑब्जेक्ट्स का समर्थन करता है, आप इसे फोरच में लपेटते हैं और फ़ाइल को उस रूप में भी प्रदान करते हैं जो इसे समझ सकता है - फ़ाइल का पूरा नाम (जिसमें पथ शामिल है)।

+0

सुझाव के लिए आपको बहुत बहुत धन्यवाद - यह निश्चित रूप से मुझे करीब ले जाता है लेकिन मैं अभी तक बिल्कुल नहीं हूं। आपका आदेश प्रत्येक फ़ाइल के लिए संपीड़न चलाने के लिए प्रतीत होता है, लेकिन इसे पहले आउटंप्रेस्ड फ़ाइल को बदलने या यहां तक ​​कि [filename] .min.js जैसे किसी भिन्न नाम के नीचे आउटपुट .js को नहीं लिखता है। मैं मूल प्रश्न – ShowStopper

+1

में ऊपर अधिक जानकारी जोड़ूंगा, आपको वास्तव में मुझे लगता है कि मुझे बहुत करीब मिल गया है - आपने अनिवार्य रूप से मुझे जवाब मैनोजल्ड दिया है, इसलिए आपकी मदद के लिए बहुत बहुत धन्यवाद! मैं आपका नाम पहचानता हूं, इसलिए मुझे एहसास है कि यद्यपि मेरे पास मेरे पिछले प्रश्नों में आपके पास कोई जवाब नहीं है, लेकिन आपने किसी और के प्रश्न का उत्तर देकर अतीत में मेरी सहायता करने में कोई संदेह नहीं किया है, इसलिए मैं चाहता हूं stackoverflow.com पर अपनी भूमिका के लिए भी आपको धन्यवाद देना पसंद है। मुझे यकीन है कि यह अक्सर असीमित हो जाता है, लेकिन मुझे लगता है कि आपकी मदद समुदाय द्वारा बहुत सराहना की जाती है। – ShowStopper

+0

@ShowStopper - अगर आपको यह समस्या हल हो जाती है तो आपको इसे उत्तर के रूप में चिह्नित करना चाहिए (एक चेकमार्क है जिसे आप प्रत्येक उत्तर से चुन सकते हैं)। बोनस अंक के लिए, आप जवाब भी अप-वोट कर सकते हैं। –

2

यह धागा आपको कुछ जवाब दे सकता है। What do you use to minimize and compress JavaScript libraries?

यह कहा गया है कि, मुझे विश्वास है कि YUI compressor में स्टैंड स्टैंड अकेले निष्पादन योग्य है जिसे PowerShell से लॉन्च किया जा सकता है।

+0

ठीक है अच्छी तरह से इस निश्चित रूप से एक शुरुआत है और YUI और गूगल के बंद संकलक के साथ खेलने के बाद, मुझे लगता है जैसे कि मैं PowerShell के साथ ऐसा करने के करीब हूं लेकिन मुझे एक महत्वपूर्ण तत्व के साथ परेशानी हो रही है। – ShowStopper

1

तो, मैंने सोचा कि अंत में मैं इस समुदाय को कुछ वापस दे दूंगा। मुझे यह कहकर शुरू करना चाहिए कि मैंने पहले कभी पावरहेल का उपयोग नहीं किया और वास्तव में इसे नापसंद किया। मुझे खुशी है कि बैश अब खिड़कियों के साथ भेज दिया गया है। लेकिन, मेरे पास एक दोस्त के लिए एक छोटी सी मजेदार परियोजना थी जो जीत सर्वर पर चलती है और अपने एटी 2 इंस्टेंस में अपने .NET ऐप के कोड को तैनात करने के बाद कुछ लिखने की आवश्यकता होती है। मुझे असली निर्माण उपकरण का उपयोग करके ऐसा करने के लिए लगभग दर्जन बेहतर तरीकों के बारे में पता है, लेकिन ... कभी-कभी एक स्क्रिप्ट वह होती है जो आप चाहते हैं। आशा है कि आप लोग इसे उपयोगी पाते हैं। यह आपको जावा स्थापित करने और बंद जार रखने की आवश्यकता है; आप अन्य minification उपकरण के साथ कोशिश कर सकते हैं।

मैं हो रही है मुझे सही दिशा में शुरू कर दिया के लिए इस पोस्ट में चेस Florell को ऋण देने के लिए की जरूरत है: How to version javascript and css files as part of a powershell build process?

################################################################## 
# 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"