2017-09-18 17 views
9

मुझे लगता है कि इस तरह दिखना एसबीटी 0.13 परियोजना परिभाषाओं का एक समूह है:मैं एसबीटी 1.0 में प्रोजेक्ट की आईडी कैसे बदलूं?

lazy val coreBase = crossProject.crossType(CrossType.Pure).in(file("core")) 
    .settings(...) 
    .jvmConfigure(_.copy(id = "core")) 
    .jsConfigure(_.copy(id = "coreJS")) 

lazy val core = coreBase.jvm 
lazy val coreJS = coreBase.js 

(ज्यादातर क्योंकि मैं Scala.js बनाता है बनाए रखने के लिए होने के बारे में क्रोधी हूँ और JVM प्रत्यय लिखने की आवश्यकता नहीं करना चाहते हर बार जब मैं परियोजनाओं को बदल रहा हूं, आदि)

यह एसबीटी 1.0 में संकलित नहीं है क्योंकि Project में अब copy विधि नहीं है।

ठीक है, चलिए the migration guide देखें।

कई केस वर्गों को कंट्राबैंड का उपयोग करके उत्पन्न छद्म केस कक्षाओं के साथ प्रतिस्थापित किया जाता है। .copy(foo = xxx) से withFoo(xxx) माइग्रेट करें।

कूल, आइए इसे आज़माएं।

build.sbt:100: error: value withId is not a member of sbt.Project 
    .jvmConfigure(_.withId("core")) 
       ^

तो मैं asked on Gitter और क्रिकेट मिला।

1.0 एपीआई दस्तावेज़ों के लिए लिंक वास्तव में कुछ इंगित करते हैं, जो कि अच्छा है, लेकिन this case में वे बहुत उपयोगी नहीं हैं, और एसबीटी स्रोत को पढ़ने की कोशिश कर मुझे सिरदर्द देता है। मैं 1.0 में अपडेट करने के लिए जल्दी नहीं हूं, लेकिन मुझे कुछ बिंदु पर जाना होगा, मुझे लगता है, और हो सकता है कि कुछ सहायक व्यक्ति ने तब तक इसका उत्तर दिया होगा।

उत्तर

14

(इस उत्तर एसबीटी 1.1.0+ और एसबीटी-crossproject 0.3.1+ के बारे में जानकारी, जो काफी पूरी बात को आसान बनाने के साथ संपादित किया गया है।)

एसबीटी 1.1.0 के साथ

और बाद में, आप उपयोग कर सकते हैं .withId("core")। लेकिन एसबीटी-क्रॉसप्रोजेक्ट 0.3.1+ के साथ बेहतर है, नीचे देखें।

मैं एक Project की आईडी बदलने के बारे में पता नहीं है, लेकिन यहाँ, भी अपने मूल मुद्दे को हल करने के लिए एक पूरी तरह से अलग तरीका है, यानी, है core/coreJScoreJVM/coreJS के बजाय। विचार उन आईडी का उपयोग करने के लिए crossProject को कस्टमाइज़ करना है, जिन्हें आप शुरू करना चाहते हैं।

सबसे पहले, आपको sbt-crossproject का उपयोग करने की आवश्यकता होगी। यह कई प्लेटफार्मों में संकलन के लिए नया "मानक" है, जो स्कैला मूल निवासी और स्वयं (स्कैला.जेएस से) से @ डेंश द्वारा सह-डिज़ाइन किया गया है। Scala.js 1.x सब कुछ एसबीटी-क्रॉसप्रोजेक्ट का उपयोग करेगा, लेकिन एसबीटी-क्रॉसप्रोजेक्ट का उपयोग Scala.js 0.6.x के साथ भी करना संभव है। इसके लिए, the instructions in the readme का पालन करें। विशेष रूप से, "पीछा" भाग मत भूलना:

// Shadow sbt-scalajs' crossProject and CrossType from Scala.js 0.6.x 
import sbtcrossproject.{crossProject, CrossType} 

एसबीटी-crossproject से अधिक लचीला है Scala.js 'हार्ड-कोडेड crossProject। इसका मतलब है कि आप इसे अधिक आसानी से अनुकूलित कर सकते हैं। विशेष रूप से, इसमें Platform की सामान्य धारणा है, यह परिभाषित करता है कि कोई भी प्लेटफ़ॉर्म कैसे व्यवहार करता है।

एक क्रॉस JVM/जे एस परियोजना के लिए, नई शैली crossProject मंगलाचरण

lazy val coreBase = crossProject(JVMPlatform, JSPlatform) 
    .crossType(CrossType.Pure) 
    .in(file("core")) 
    .settings(...) 
    .jvmConfigure(_.copy(id = "core")) 
    .jsConfigure(_.copy(id = "coreJS")) 

lazy val core = coreBase.jvm 
lazy val coreJS = coreBase.js 

होगा एसबीटी-crossproject 0.3.1 के साथ शुरू, तो आप बस में से एक के लिए मंच प्रत्यय जोड़ने के लिए नहीं यह बता सकते हैं आपके प्लेटफार्मआपके मामले में, आप JVM मंच के लिए प्रत्यय से बचना चाहते हैं, तो आप लिखते थे:

lazy val coreBase = crossProject(JVMPlatform, JSPlatform) 
    .withoutSuffixFor(JVMPlatform) 
    .crossType(CrossType.Pure) 
    ... 

lazy val core = coreBase.jvm 
lazy val coreJS = coreBase.js 

और कहा कि तुम सब करने की जरूरत है!

पुराना जवाब है, एसबीटी-crossproject लागू करने के लिए 0.3.0 और इससे पहले कि

JVMPlatform और JSPlatform एक एडीटी नहीं हैं; वे एक ओओ शैली में डिजाइन किए गए हैं। इसका मतलब है कि आप अपना खुद का बना सकते हैं। विशेष रूप से, आप बना सकते हैं अपने खुद के JVMPlatformNoSuffix कि JVMPlatform के रूप में लेकिन इस परियोजना आईडी के लिए एक प्रत्यय जोड़े बिना भी ऐसा ही होगा:

import sbt._ 
import sbtcrossproject._ 

case object JVMPlatformNoSuffix extends Platform { 
    def identifier: String = "jvm" 
    def sbtSuffix: String = "" // <-- here is the magical empty string 
    def enable(project: Project): Project = project 
    val crossBinary: CrossVersion = CrossVersion.binary 
    val crossFull: CrossVersion = CrossVersion.full 
} 

अब जब कि काफी पर्याप्त नहीं अभी तक है, क्योंकि .jvmSettings(...) और दोस्तों के एक से कार्रवाई के लिए परिभाषित कर रहे हैं JVMPlatform, जैसे किसी अन्य Platform पर नहीं। इसलिए कि फिर से परिभाषित करने के साथ-साथ होगा:

implicit def JVMNoSuffixCrossProjectBuilderOps(
    builder: CrossProject.Builder): JVMNoSuffixCrossProjectOps = 
    new JVMNoSuffixCrossProjectOps(builder) 

implicit class JVMNoSuffixCrossProjectOps(project: CrossProject) { 
    def jvm: Project = project.projects(JVMPlatformNoSuffix) 

    def jvmSettings(ss: Def.SettingsDefinition*): CrossProject = 
    jvmConfigure(_.settings(ss: _*)) 

    def jvmConfigure(transformer: Project => Project): CrossProject = 
    project.configurePlatform(JVMPlatformNoSuffix)(transformer) 
} 

एक बार जब आप अपने निर्माण (एक project/JVMPlatformNoSuffix.scala में दूर आदेश .sbt फ़ाइल को प्रदूषित करने के लिए नहीं में छिपा) में यह सब है, तो आप के ऊपर पार परिभाषित कर सकते हैं परियोजना के रूप में:

lazy val coreBase = crossProject(JVMPlatformNoSuffix, JSPlatform) 
    .crossType(CrossType.Pure) 
    .in(file("core")) 
    .settings(...) 

lazy val core = coreBase.jvm 
lazy val coreJS = coreBase.js 

स्पष्ट रूप से प्रोजेक्ट आईडी को पैच करने की आवश्यकता के बिना।

+2

मैंने इस विचार को लागू करने के लिए https://github.com/scala-native/sbt-crossproject/pull/61 बनाया है। मुझे लगता है कि यह पैटर्न सीधे प्लगइन में शामिल करने के लिए पर्याप्त है। –

+0

फिर से धन्यवाद, @ एसजेआरडी! मैं इस जवाब को स्वीकार कर रहा हूं लेकिन अगर किसी के पास 'आईडी' को बदलने का आसान तरीका है तो मुझे इसे देखने में दिलचस्पी होगी। –

+1

आगामी एसबीटी 1.1 बीटीडब्ल्यू में फिक्स्ड: https://github.com/sbt/sbt/pull/3601। –

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