2011-08-20 18 views
25

मैं शैल से एक एसबीटी ऐप कैसे चला सकता हूं, ताकि मैं अपना ऐप सामान्य कमांड लाइन प्रोग्राम के रूप में चला सकूं (जैसे कि scala के माध्यम से सीधे चलाएं लेकिन बिना किसी विशाल वर्गपथ को स्थापित किए)?मैं सामान्य कमांड लाइन प्रोग्राम के रूप में खोल से एक एसबीटी मुख्य वर्ग कैसे चला सकता हूं?

मैं जानता हूँ कि मैं कर सकते हैं:

echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt 

लेकिन इस (1) हमेशा के लिए ले जाता है शुरू करने के लिए है क्योंकि यह एसबीटी शुरू होता है, (2) सभी stdout और stderr का कारण बनता है stdout के लिए जाने के लिए, और (3) सभी का कारण बनता है आउटपुट को लॉगर [जानकारी] या [त्रुटि] से सजाया जाना चाहिए।

मैंने https://github.com/harrah/xsbt/wiki/Launcher पर देखा लेकिन यह बहुत भारी लगता है, क्योंकि यह निर्भरता डाउनलोड करता है और एक नया वातावरण स्थापित करता है और क्या नहीं। मैं सिर्फ इस ऐप को अपने मौजूदा विकास पर्यावरण में चलाने के लिए चाहता हूं।

अब तक मैंने क्लासपाथ बनाने के लिए अपनी खुद की लिपि को एक साथ जोड़ दिया है, और आप कुछ अन्य चीजें भी कर सकते हैं जैसे modify your project file to get sbt to print the raw classpath, लेकिन मुझे लगता है कि एक बेहतर तरीका होना चाहिए।

+0

जैसे 'एमवीएन निष्पादन: जावा' या 'एमवीएन एपसेम्बलर: इकट्ठा करें – sourcedelica

उत्तर

9

start-script SBT plugin में है उस मंच पर (नीचे देखें)।

सेटअप

  1. स्थापित greadlink (केवल ओएस एक्स):

    एक) brew install coreutils

    ख) मानचित्र में ये पंक्तियां जोड़कर readlink नया समारोह (जी readlink) करने के लिए ~/.bashrc:

    फ़ंक्शन रीडलिंक() {greadlink "$ @"; }

    निर्यात -f

  2. readlink` शुरू स्क्रिप्ट प्लगइन करने के लिए ~/.sbt/plugins/build.sbt जोड़ें:

    addSbtPlugin ("com.typesafe.sbt"% "एसबीटी शुरू -script "%" 0.8.0 ")

  3. चालू परियोजना शुरू करने के लिए स्क्रिप्ट कार्य करें:

    $ sbt add-start-script-tasks # निर्देशिका से निष्पादित जहां build.sbt रहता

  4. वर्तमान build.sbt के लिए शुरू स्क्रिप्ट समर्थन जोड़ें:

    आयात com.typesafe.sbt.SbtStartScript

    seq (SbtStartScript.startScriptForClassesSettings: _ *)

नोट में रिक्त पंक्ति बयानों के बीच (एसबीटी बिल्ड फाइलों के लिए डी rigueur)।

प्रारंभ स्क्रिप्ट उत्पन्न

तो फिर तुम sbt run-main की तरह अपने अनुप्रयोग शुरू करने के लिए एक स्क्रिप्ट बनाना चाहते हैं जब भी, लेकिन एसबीटी के बिना, निष्पादित करें:

$ sbt start-script 

भागो

target/start mypackage.MyMainClass 
+0

वह प्लगइन बहुत अच्छा है लेकिन उनके गिटूब के शीर्ष पर वे बहुत ही उचित रूप से कहते हैं कि _Consider sbt-native-packager बदले में – tksfz

+0

@tksfz हां, चीजें बेहतर के लिए बदल गई हैं ... एसबीटी मूल पैकेजर महान है । –

16

यहाँ क्या मैं अपने एसबीटी (संस्करण 0.10) परियोजना परिभाषा है है,

val Mklauncher = config("mklauncher") extend(Compile) 
    val mklauncher = TaskKey[Unit]("mklauncher") 
    val mklauncherTask = mklauncher <<= (target, fullClasspath in Runtime) map { (target, cp) => 
    def writeFile(file: File, str: String) { 
     val writer = new PrintWriter(file) 
     writer.println(str) 
     writer.close() 
    } 
    val cpString = cp.map(_.data).mkString(":") 
    val launchString = """ 
CLASSPATH="%s" 
scala -usejavacp -Djava.class.path="${CLASSPATH}" "[email protected]" 
""".format(cpString) 
    val targetFile = (target/"scala-sbt").asFile 
    writeFile(targetFile, launchString) 
    targetFile.setExecutable(true) 
    } 

    ... // remember to add mklauncherTask to Project Settings 

mklauncher काम के लिए एक स्क्रिप्ट target/scala-sbt कि पहले से ही सेट परियोजना classpath साथ scala कार्यान्वित पैदा करता है। क्लासपाथ में परिवर्तन होने पर mklauncher स्वचालित रूप से निष्पादित होना अच्छा लगेगा, लेकिन मैंने अभी तक ऐसा करने में नहीं देखा है।

(मैं जावा classpath उपयोग करते हैं, बल्कि स्काला की तुलना में, एम्बेडेड दुभाषियों बनाने में आसानी के लिए।)

+15

जब आप क्लासपाथ बदलते हैं तो mklauncher पुनर्निर्माण के साथ खत्म करते हैं (कहें, इस रात? ;-), इसे प्लगइन में बदल दें, इसे जिथब में भेजें , और इसे एसबीटी प्लगइन्स पेज में डाल दिया, ठीक है? –

+0

डैनियल के अनुरोध के लिए टक्कर ;-) – Jack

2

बस एसबीटी शुरू स्क्रिप्ट प्लगइन की खोज: https://github.com/typesafehub/xsbt-start-script-plugin:

इस प्लगइन आप एक उत्पन्न करने के लिए अनुमति देता है स्क्रिप्ट लक्ष्य/ प्रोजेक्ट के लिए प्रारंभ करें। स्क्रिप्ट परियोजना "इन-प्लेस" चलाएगी (बिना बिना किसी पैकेज का निर्माण)।

लक्ष्य/प्रारंभ स्क्रिप्ट एसबीटी रन के समान है लेकिन यह एसबीटी पर निर्भर नहीं है। एसबीटी रन उत्पादन के उपयोग के लिए अनुशंसित नहीं है क्योंकि यह एसबीटी स्वयं स्मृति में रहता है। लक्ष्य/प्रारंभ उत्पादन में ऐप चलाने का इरादा है।

प्लगइन एक कार्य स्टार्ट-स्क्रिप्ट जोड़ता है जो लक्ष्य/प्रारंभ उत्पन्न करता है। यह स्टार्ट-स्क्रिप्ट कार्य को उपरोक्त चरण चरण भी जोड़ता है।

https://github.com/sbt/sbt-start-script

इसे सेट करने के लिए कुछ कदम की आवश्यकता है और लिपियों कि ओएस एक्स पर काम नहीं करते उत्पन्न करता है, लेकिन है कि आसानी से ठीक किया जा सकता है, तो आप कर रहे हैं:

9

समय मक्खियों द्वारा और अन्य उत्तरों के बाद से बहुत कुछ बदल गया है। वर्तमान में यह एसबीटी 0.13.6 समय है।

मुझे लगता है कि आपको क्या चाहिए the sbt-onejar plugin या the SBT Native Packager plugin है।

एसबीटी-onejar"अपने सभी कोड और नेस्ट जार के रूप में निर्भरता वाली एकल निष्पादन योग्य जार के निर्माण के लिए एक सरल-निर्माण उपकरण प्लगइन है।"

एसबीटी मूल निवासी Packager के "लक्ष्य स्काला सॉफ्टवेयर देशी पैकेजिंग प्रणाली, देब, आरपीएम, homebrew, एमएसआई की तरह के लिए एसबीटी के साथ बनाया गया ऊपर बंडल करने में सक्षम होना है।"

+0

एसबीटी देशी पैकर दो (?) से अधिक बनाए रखा की तरह दिखता है। http://www.scala-sbt.org/sbt-native-packager/GettingStartedApplications/MyFirstProject.html आप मेरी विनम्र अनुभव में अपेक्षाकृत जल्दी जा रहा हो जाता है। – matanster

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