2012-05-21 20 views
11

मैं काम पर एक परियोजना शुरू कर और सोच रहा था क्या सबसे अच्छा निर्माण उपकरण होगा उपयोग करने के लिए साथ Coffeescript/नोड परियोजना।बिल्ड उपकरण: कई घटकों

पूरी बात CoffeeScript में लिखा है, सर्वर के लिए क्लाइंट-साइड और NodeJS के लिए AngularJS का उपयोग कर।

  • एक iPad अनुप्रयोग
  • एक iPhone app (ipad से अलग कार्यक्षमता)
  • क्षुधा के लिए
  • एक सीएमएस
  • एक NodeJS सर्वर
  • :

    अनुप्रयोग के लिए कई घटक हैं

इन सभी के बीच साझा कोड, सब फिर से CoffeeScript में लिखा की टन है।

मैं एक निर्माण उपकरण मैं कहाँ सूचीबद्ध कर सकते हैं जो एप्लिकेशन का उपयोग करता क्या कोड (जिसमें से अधिकतर साझा) और यह एक अलग फ़ोल्डर में प्रत्येक अनुप्रयोग की जावास्क्रिप्ट फ़ाइलों का निर्माण होगा चाहते हैं।

उदाहरण के लिए, मैं '/ compiled/ipad /' नामक एक फ़ोल्डर स्थापित करता हूं जिसमें index.html, और जेएस, सीएसएस, आईएमजी, आदि के लिए फ़ोल्डर्स हैं। मैं सूचीबद्ध करता हूं कि संकलित कॉफी फाइलें जिन्हें मैं फेंकना/संकलित करना चाहता हूं/ipad/js (इसमें से कुछ /src/shared/*.coffee से, इनमें से कुछ /src/ipad/*.coffee, आदि से) और मैं कौन सी फाइलों को/compiled/ipad/css में फेंकना चाहता हूं। मैं चाहता हूं कि यह फाइलों को आसानी से संयोजित करने में सक्षम हो, मैं भी कैसे चाहता हूं।

यह भी से/src/परीक्षण//compiled/test/ipad/*.js में ipad मेरी परीक्षण संकलन, होगा।

मेरे सभी क्लाइंट-साइड यूनिट परीक्षण testacular का उपयोग करके लिखे गए हैं और मुझे यकीन नहीं है कि मैं अभी तक सर्वर-साइड यूनिट परीक्षण क्या लिखूंगा।

क्या निर्माण उपकरण/कॉन्फ़िगरेशन यहां सबसे अच्छा तरीका है? एक मेकफ़ाइल? ग्रंट की तरह कुछ? मैं पूरे निर्माण दृश्य के लिए ईमानदारी से नया हूँ।

संपादित करें: ब्राउज़रify के साथ जाने का निर्णय लिया। आप यहां कोणीय के साथ काम करने के लिए अपना समाधान ढूंढ सकते हैं: https://groups.google.com/forum/#!topic/angular/ytoVaikOcCs

+0

+1। महान सवाल और मैंने कभी एंगुलरजेएस के बारे में कभी नहीं सुना है। यह सुन्दर दिखाई दे रहा है। – Jivings

उत्तर

3

मैं में सभी साझा कोड डाल मॉड्यूल Node.js और एक परियोजना है कि निम्नलिखित की तरह कुछ लग रहा है बनाने के लिए: क्लाइंट साइड ऐप्लिकेशन, जहां जरूरत बनाने के लिए

Project 
|~apps/ 
| |~cms/ 
| | `-app.js 
| |~ipad/ 
| | `-app.js 
| |~iphone/ 
| | `-app.js 
| `~node/ 
| `-app.js 
|~libs/ 
| |-module.js 
| `-module2.js 
|~specs/ 
| |~cms/ 
| | `-app.js 
| |~ipad/ 
| | `-app.js 
| |~iphone/ 
| | `-app.js 
| `~node/ 
| `-app.js 
| `~libs/ 
| |-module.js 
| `-module2.js 
`-Makefile 

मैं तो Browserify की तरह कुछ का प्रयोग करेंगे (वहाँ दूसरों रहे हैं)। इस तरह एक बिल्ड फ़ाइल रखने के बजाय जहां आप कहते हैं कि आपको क्या चाहिए, वास्तव में असली ऐप्स मॉड्यूल आयात कर रहे हैं।

+0

यह भी ध्यान दिया कि मैंने ब्राउज़र की बजाय ब्राउज़रिंग कहा। – Pickels

+0

अंत में ब्राउज़र के साथ धन्यवाद, धन्यवाद। :-)। आप देख सकते हैं कि मैंने इसे अपने मुख्य पोस्ट में संपादित करने में कैसे काम किया। –

4

व्यक्तिगत रूप से मुझे लगता है कि जावास्क्रिप्ट या कॉफ़ीस्क्रिप्ट में सर्वर साइड कोड लिखने के लिए ड्राइव भी आपके निर्माण टूल श्रृंखला तक फैली हुई है: इसलिए जावास्क्रिप्ट/कॉफ़ीस्क्रिप्ट का उपयोग करने के साथ भी चिपके रहें । यह आपको अपने निर्माण उपकरण से आसानी से अपने सर्वर/क्लाइंट कार्यों को स्वचालित करने की अनुमति देगा - मुझे संदेह है कि यह किसी अन्य टूल के साथ अर्थपूर्ण रूप से संभव होगा (आप केवल node.js कमांड कॉल के आसपास रैपर लिख रहे होंगे)। सुझाव, संरचित सत्ता द्वारा आदेश दिया:

  • node.js: बस जावास्क्रिप्ट में अपने निर्माण स्क्रिप्ट रोल, और उन्हें नोड के साथ आह्वान। शैल स्क्रिप्ट के लिए Akin, मुझे लगता है। मैं इस मार्ग की सिफारिश नहीं करता हूं।
  • jake या cake: मैं तो अपने आश्चर्य की बात नहीं है कि इन थोड़े चींटी की मुझे याद दिलाने जावा दुनिया से हूँ,। मैं कॉफ़ीस्क्रिप्ट पसंद करता हूं, और इसलिए केक पसंद करते हैं।
  • grunt: मैंने इससे पहले नहीं सुना था इसलिए मैं ज्यादा सलाह नहीं दे सकता। यह मुझे मावेन की याद दिलाता है, ज़ाहिर है ... और मैं बस इतना कह सकता हूं ... एक निर्माण उपकरण जितना अधिक ढांचा कम लचीला लागू करने के लिए होता है। यह एक व्यापार बंद है। जब तक आप इसे 'बिल्ड टूल' करते हैं, तो आप बहुत समय बचा सकते हैं। लेकिन अगर आपके पास ऐप विशिष्ट समस्याएं हैं, तो यह हल करने के लिए एक शाही दर्द हो सकता है।
बेशक

, आप कुछ अन्य निर्माण उपकरण के साथ जा सकते हैं आप पहले से ही कुछ अन्य भाषा से परिचित हैं: रेक, Maven, चींटी, Gradle, वगैरह वगैरह

4

मैंने आवश्यकतानुसार नोड मॉड्यूल का उपयोग करके केकफ़ाइल में लगभग यह सटीक चीज़ की।

कुछ वैश्विक चर सेट करें जो प्रत्येक फ़ाइल के पथ के साथ सरणी हैं, उन फ़ाइलों को संकलित निर्देशिका में फ़ाइल में संयोजित करें, फिर उस फ़ाइल को जेएस में संकलित करें।

शैलियों के लिए, संकलन के बिना संगतता के साथ एक ही चीज़, स्पष्ट रूप से।

fs = require 'fs' 
path = require 'path' 
{spawn, exec} = require 'child_process' 
parser = require('uglify-js').parser 
uglify = require('uglify-js').uglify 
cleanCss = require 'clean-css' 

coffees = 
[ 
    "/src/shared/file1.coffee" 
    "/src/shared/file2.coffee" 
    "/src/ipad/file1.coffee" 
] 

tests = 
    [ 
    "/src/ipad/tests.coffee" 
    ] 

styles = 
[ 
    "/src/ipad/styles1.css" 
    "/src/shared/styles2.css" 
] 

concatenate = (destinationFile, files, type) -> 
    newContents = new Array 
    remaining = files.length 
    for file, index in files then do (file, index) -> 
     fs.readFile file, 'utf8', (err, fileContents) -> 
      throw err if err 
      newContents[index] = fileContents 
      if --remaining is 0 
       fs.writeFile destinationFile, newContents.join '\n\n', 'utf8', (err) -> 
       throw err if err 
       if type is 'styles' 
       minifyCss fileName 
       else 
       compileCoffee fileName 


compileCoffee = (file) -> 
    exec "coffee -C#{file}", (err) -> 
     throw err if err 
     # delete coffee file leaving only js 
     fs.unlink 'path/specifying/compiled_coffee', (err) -> 
      throw err if err 
      minifyJs file 

minifyJs = (file) -> 
    fs.readFile f, 'utf8', (err, contents) -> 
     ast = parser.parse contents 
     ast = uglify.ast_mangle ast 
     ast = uglify.ast_squeeze ast 
     minified = uglify.gen_code ast 

     writeMinified file, minified 

writeMinified = (file, contents) -> 
    fs.writeFile file, contents, 'utf8', (err) -> throw err if err 


minifyCss = (file) -> 
    fs.readFile file, 'utf8', (err, contents) -> 
    throw err if err 
    minimized = cleanCss.process contents 
    clean = minimized.replace 'app/assets', '' 

    fs.writeFile file, clean, 'utf8', (err) -> 
     throw err if err 


task 'compile_coffees', 'concat, compile, and minify coffees', -> 
    concatenate '/compiled/ipad/code.coffee', coffees, 'coffee' 

task 'concat_styles', 'concat and minify styles', -> 
    concatenate '/compiled/ipad/css/styles.css', styles, 'styles' 

task 'compile_tests', 'concat, compile, and minify test', -> 
    concatenate '/compiled/ipad/tests.coffee', tests, 'tests' 

अब यह वही है जो मुझे लगता है कि आप पूछ रहे हैं।

निश्चित रूप से सुंदर हो सकता है, विशेष रूप से minified सामग्री लिखने के लिए एक अलग कार्य है, लेकिन यह काम करता है।

शैलियों के लिए बिल्कुल सही नहीं है क्योंकि मैं सास का उपयोग कर रहा था और इसे छोटा कार्य करने से पहले अन्य कार्यों में था, लेकिन मुझे लगता है कि आपको यह विचार मिलता है।

संबंधित मुद्दे