কেউ এসবিটি ব্যবহারের সঠিক উপায়টি ব্যাখ্যা করতে পারেন?


100

আমি এই পায়খানা থেকে বেরিয়ে আছি! আমি এসবিটি বুঝতে পারি না। সেখানে, আমি এটি বলেছিলাম, এখন আমাকে সাহায্য করুন দয়া করে।

সকল সড়ক রোম হতে, এবং যে SBT জন্য একই: শুরু করতে সঙ্গে SBTআছে SBT, SBT Launcher, SBT-extras, ইত্যাদি এবং তারপর সেখানে অন্তর্ভুক্ত করা এবং ভান্ডার সিদ্ধান্ত নেওয়ার বিভিন্ন উপায় আছে। একটি 'সেরা' উপায় আছে?

আমি জিজ্ঞাসা করছি কারণ মাঝে মাঝে আমি কিছুটা হারিয়ে যাই। এসবিটি ডকুমেন্টেশন খুব পুঙ্খানুপুঙ্খ এবং সম্পূর্ণ, তবে আমি কখন ব্যবহার করব build.sbtবা project/build.propertiesবা project/Build.scalaবা নিজের জানা নেই project/plugins.sbt

তারপরে এটি মজাদার হয়ে ওঠে, সেখানে Scala-IDEএবং SBT- এগুলি একসাথে ব্যবহারের সঠিক উপায় কী? প্রথমে কী আসে, মুরগি নাকি ডিম?

সর্বাধিক গুরুত্বপূর্ণটি হ'ল, আপনার প্রকল্পে অন্তর্ভুক্ত করার জন্য সঠিক সংগ্রহস্থল এবং সংস্করণগুলি কীভাবে পাবেন? আমি কি কেবল একটি ম্যাচেটটি বের করে আমার পথের হ্যাকিং শুরু করি? আমি প্রায়শই এমন প্রকল্পগুলি খুঁজে পাই যাগুলিতে সমস্ত কিছু এবং রান্নাঘরের ডোবা অন্তর্ভুক্ত থাকে এবং তারপরে আমি বুঝতে পারি - আমিই একা নই যে কিছুটা হারিয়ে যায়।

একটি সাধারণ উদাহরণ হিসাবে, এখনই, আমি একটি একেবারে নতুন প্রকল্প শুরু করছি। আমি সাম্প্রতিক বৈশিষ্ট্য ব্যবহার করতে চান SLICKএবং Scalaএবং এই সম্ভবত SBT এর সর্বশেষ সংস্করণ প্রয়োজন হবে। শুরু করার বুদ্ধিমান বিষয়টি কী এবং কেন? কোন ফাইলের মধ্যে আমি এটি সংজ্ঞায়িত করব এবং এটি কীভাবে দেখা উচিত? আমি জানি আমি এই কাজটি পেতে পারি, তবে সবকিছুর দিকে যাওয়া উচিত (কেন এটি সেখানে যেতে হবে তা বোনাস হবে) সম্পর্কে আমি বিশেষজ্ঞের মতামতটি চাই।

আমি SBTএক বছরেরও বেশি সময় ধরে ছোট প্রকল্পগুলির জন্য ব্যবহার করছি। আমি ব্যবহার করেছি SBTএবং তারপরে SBT Extras(যেহেতু এটি কিছু মাথাব্যাথাটিকে যাদুকরীভাবে অদৃশ্য করে দিয়েছে), তবে কেন আমি এক বা অন্যটি ব্যবহার করব তা নিশ্চিত নই। জিনিসগুলি কীভাবে একসাথে ফিট হয় তা বুঝতে না পেরে আমি কিছুটা হতাশ হয়ে SBTপড়ছি ( এবং ভান্ডারগুলি), এবং মনে হয় এটি যদি পরবর্তী দিকের লোকটিকে এইভাবে আগমন করে তবে অনেক কষ্ট সহ্য করতে হবে যদি এটি মানবিক দিক দিয়ে ব্যাখ্যা করা যায়।


4
"স্ক্যালাল-আইডিই এবং এসবিটি আছে" এর সাথে আপনার সঠিক অর্থ কী? আপনি আপনার প্রকল্পটি এসবিটি দিয়ে সংজ্ঞায়িত করেন এবং এসবিটি একটি আদর্শ (গ্রহপদ ওভার ইন্টেলিজ) প্রকল্প তৈরি করতে পারে। সুতরাং এসবিটি প্রথম আসে ...
জানুয়ারী

4
@ জান আমি উল্লেখ করেছি যে স্কালা-আইডিই বিল্ড ম্যানেজার হিসাবে এসবিটি ব্যবহার করে। Assembla.com/spaces/scala-ide/wiki/SBT- বেসড_বিল্ড_ম্যানেজার দেখুন এবং নীচে নীচে তারা উল্লেখ করেছেন যে "আপনার এসবিটি প্রকল্প ফাইল সংজ্ঞায়নের দরকার নেই।" আমি বিভ্রান্তিকর।
জ্যাক

ঠিক আছে. আমি সাধারণত স্কেল সম্পাদনা করার জন্য ইন্টেলিজ (বা মহাকাশ) ব্যবহার করি তা আমি জানতাম না। আমার ধারণা বিল্ডার তার নিজস্ব এসবিটি কনফিগারস উত্পন্ন করে?
জানুয়ারী

4
@ জ্যাকোবসআর আপনার প্রকল্পের উত্স তৈরিতে স্কালা আইডিই এসবিটি ব্যবহার করে এমন বাস্তবায়ন একটি বাস্তবায়ন বিশদ, এবং ব্যবহারকারীদের এ সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই । সত্যিই 0 জড়িত আছে। Eclipse এর বাইরের ব্যবহারকারীরা এসবিটি, মাভেন, পিপীলিকা, ... দিয়ে একটি প্রকল্প তৈরি করতে পারেন এবং এটি স্কালা আইডিইয়ের জন্য কোনও পার্থক্য তৈরি করবে না। আরও একটি বিষয়, আপনার যদি একটি এসবিটি প্রকল্প রয়েছে তবুও স্কালাল আইডিই যত্ন করে না, অর্থাত ক্লাসপথটিBuild.scala সেট আপ করার জন্য এটি আপনার খোঁজ করে না এবং এজন্যই আপনাকে অবশ্যই একটিগ্রন্থ .ক্লাসপথ তৈরি করার জন্য sbteclipse প্রয়োজন। আশাকরি এটা সাহায্য করবে.
মিরিকো ডটটা

4
@ জ্যান স্কাল আইডিই বিভ্রান্তির যোগ করেছে, এবং হ্যাঁ, ডকুমেন্টেশন যা একটি ভাল স্কালাল ডেভলপমেন্ট পরিবেশ স্থাপন এবং একটি উপযুক্ত প্রোগ্রামিং ওয়ার্কফ্লো সম্পর্কে কিছু দৃ guidance় দিকনির্দেশনা দেওয়ার ক্ষেত্রে একটি বড় চিত্র দেয় very
জ্যাক

উত্তর:


29

সর্বাধিক গুরুত্বপূর্ণটি হ'ল, আপনার প্রকল্পে অন্তর্ভুক্ত করার জন্য সঠিক সংগ্রহস্থল এবং সংস্করণগুলি কীভাবে পাবেন? আমি কি কেবল একটি ম্যাচেটটি বের করে আমার পথের হ্যাকিং শুরু করি? আমি প্রায়শই এমন প্রকল্পগুলি খুঁজে পাই যাতে সমস্ত কিছু এবং রান্নাঘরের ডোবা অন্তর্ভুক্ত থাকে

স্কালা-ভিত্তিক নির্ভরতাগুলির জন্য, আমি লেখকরা যা সুপারিশ করেন তার সাথে আমি যাব। উদাহরণস্বরূপ: http://code.google.com/p/scalaz/#SBT ব্যবহারের নির্দেশ দেয়:

libraryDependencies += "org.scalaz" %% "scalaz-core" % "6.0.4"

অথবা https://github.com/tyypeafehub/sbteclipse/- এ কোথায় যুক্ত করবেন সে সম্পর্কে নির্দেশনা রয়েছে:

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.0-RC1")

জাভা ভিত্তিক নির্ভরতাগুলির জন্য, আমি সেখানে কী আছে তা দেখতে http://mvnrepository.com/ ব্যবহার করি, তারপরে এসবিটি ট্যাবে ক্লিক করুন। উদাহরণস্বরূপ http://mvnrepository.com/artifact/net.sf.opencsv/opencsv/2.3 ব্যবহারের নির্দেশ দেয়:

libraryDependencies += "net.sf.opencsv" % "opencsv" % "2.3"

তারপরে ম্যাচেটটি টানুন এবং আপনার সামনের দিকে হ্যাক শুরু করুন। আপনি যদি ভাগ্যবান হন তবে আপনি কিছু জারগুলি ব্যবহার করবেন না যা একই কিছু জারের উপর নির্ভর করে তবে বেমানান সংস্করণগুলিতে। জাভা ইকোসিস্টেম দেওয়া, আপনি প্রায়শই সবকিছু এবং রান্নাঘরের সিঙ্ক সহ শেষ করেন এবং নির্ভরতা নির্মূল করতে বা আপনার প্রয়োজনীয় নির্ভরতা অনুপস্থিত না তা নিশ্চিত করার জন্য কিছুটা প্রচেষ্টা নেওয়া দরকার।

একটি সাধারণ উদাহরণ হিসাবে, এখনই, আমি একটি একেবারে নতুন প্রকল্প শুরু করছি। আমি SLICK এবং Scala এর সর্বশেষতম বৈশিষ্ট্যগুলি ব্যবহার করতে চাই এবং এটির জন্য সম্ভবত এসবিটির সর্বশেষতম সংস্করণ প্রয়োজন। শুরু করার বুদ্ধিমান বিষয়টি কী এবং কেন?

আমি মনে করি ধীরে ধীরে এসবিটি-র প্রতিরোধ ক্ষমতা তৈরি করা বুদ্ধিমান বিন্দু ।

আপনি বুঝতে পেরেছেন তা নিশ্চিত করুন:

  1. স্কোপ ফর্ম্যাট {<build-uri>}<project-id>/config:key(for task-key)
  2. সেটিংস 3 স্বাদে ( SettingKey, TaskKey, InputKey) - অধ্যায় "কার্য কী" নামক পড়া http://www.scala-sbt.org/release/docs/Getting-Started/Basic-Def

এই 4 টি পৃষ্ঠা সর্বদা খোলা রাখুন যাতে আপনি লাফিয়ে বিভিন্ন সংজ্ঞা এবং উদাহরণ সন্ধান করতে পারেন:

  1. http://www.scala-sbt.org/release/docs/Getting-Started/Basic-Def
  2. http://www.scala-sbt.org/release/docs/ বিবরণী- টপিকস / ইনডেক্স
  3. http://harrah.github.com/xsbt/latest/sxr/Keys.scala.html
  4. http://harrah.github.com/xsbt/latest/sxr/Defaults.scala.html

সর্বোচ্চ ব্যবহার করুন showএবং inspect ট্যাবে সমাপ্তির সেটিংস, তাদের নির্ভরতা, সংজ্ঞা এবং এই সংক্রান্ত সেটিংসে প্রকৃত মান সঙ্গে পরিচিত পেতে। আমি বিশ্বাস করি না যে সম্পর্কগুলি আপনি ব্যবহার করবেন inspectতা কোথাও নথিভুক্ত হয়েছে। যদি এর থেকে আরও ভাল উপায় থাকে তবে আমি এটি সম্পর্কে জানতে চাই।


25

আমি যেভাবে এসবিটি ব্যবহার করি তা হ'ল:

  1. এসবিটি-এক্সট্রা ব্যবহার করুন - কেবল শেল স্ক্রিপ্টটি পান এবং এটি আপনার প্রকল্পের মূলটিতে যুক্ত করুন
  2. এসবিটি স্থাপনের জন্য projectএকটি MyProject.scalaফাইল সহ একটি ফোল্ডার তৈরি করুন । আমি build.sbtএটিকে পদ্ধতির চেয়ে বেশি পছন্দ করি - এটি স্কেল এবং আরও নমনীয়
  3. একটি project/plugins.sbtফাইল তৈরি করুন এবং আপনার আইডিইর জন্য উপযুক্ত প্লাগইন যুক্ত করুন। হয় এসবিটি-একলিপস, এসবিটি-আইডিয়া বা এনসাইম-এসবিটি-সেমিডি যাতে আপনি গ্রহন, ইন্টেলিজ বা এনসাইমের জন্য প্রজেক্ট ফাইল তৈরি করতে পারেন।
  4. আপনার প্রকল্পের মূলে sbt আরম্ভ করুন এবং আপনার আইডিই জন্য প্রকল্প ফাইল উত্পন্ন করুন
  5. লাভ

আইডিই প্রজেক্ট ফাইলগুলি এসবিটি দ্বারা উত্পাদিত হওয়ার কারণে আমি চেক করা বিরক্ত করি না, তবে আপনি এটি করতে চান এমন কোনও কারণ থাকতে পারে।

আপনি এখানে এখানে একটি উদাহরণ সেট আপ দেখতে পারেন ।


ভাল উত্তরের জন্য আপনাকে ধন্যবাদ। আমি অন্য উত্তরটি মেনে নিয়েছি, কারণ এটি আরও স্থলটি জুড়েছে এবং আপনার কারণটিকে আপ-ভোট দিয়েছে এটি সত্যই ভাল। পারলে উভয়ই গ্রহণ করতাম।
জ্যাক

0

প্রজেক্ট টেমপ্লেট এবং বীজগুলির সাথে এসবিটি কল করার অভিনব উপায়, টাইপসেফ অ্যাক্টিভেটর ব্যবহার করুন: https://tyypeafe.com/ activator

Activator new

Fetching the latest list of templates...

Browse the list of templates: http://typesafe.com/activator/templates
Choose from these featured templates or enter a template name:
 1) minimal-java
 2) minimal-scala
 3) play-java
 4) play-scala
(hit tab to see a list of all templates)

5
আমি এই ধারণাটির পক্ষে আংশিক, যখন সন্দেহ হয়, মিশ্রণটিতে আরও যাদু যুক্ত করা আপনার সমস্যার সমাধানের সম্ভাবনা না রাখে।
কিউবিক

0

স্থাপন

brew install sbt প্রযুক্তিগতভাবে বলতে গেলে যেগুলি সমন্বিত এসবিটি বা অনুরূপ ইনস্টলগুলি রয়েছে

আপনি যখন sbtটার্মিনাল থেকে চালাবেন এটি আসলে এসবিটি লঞ্চার বাশ স্ক্রিপ্টটি চালায়। ব্যক্তিগতভাবে, আমাকে কখনই এই ত্রিত্ব সম্পর্কে চিন্তা করতে হবে না, এবং কেবল এসবিটি ব্যবহার করুন যেন এটি কোনও জিনিস।

কনফিগারেশন

প্রকল্পের মূলটিতে একটি নির্দিষ্ট প্রকল্প সেভ .sbtoptsফাইলের জন্য এসবিটি কনফিগার করতে । এসবিটি সিস্টেম-ব্যাপী সংশোধন কনফিগার করতে /usr/local/etc/sbtopts। কার্যকর করার সময় sbt -helpআপনাকে সঠিক অবস্থানটি বলা উচিত। উদাহরণস্বরূপ, ওয়ান-অফ এক্সিকিউটিভ হিসাবে এসবিটি আরও মেমরি দেওয়া বা মেমরি বৃদ্ধি বা স্থায়ীভাবে কার্যকর হওয়ার জন্য sbt -mem 4096সংরক্ষণ -mem 4096করা ।.sbtoptssbtopts

 প্রকল্প কাঠামো

sbt new scala/scala-seed.g8 একটি সর্বনিম্ন হ্যালো ওয়ার্ল্ড এসবিটি প্রকল্প কাঠামো তৈরি করে

.
├── README.md  // most important part of any software project
├── build.sbt  // build definition of the project
├── project    // build definition of the build (sbt is recursive - explained below)
├── src        // test and main source code
└── target     // compiled classes, deployment package

ঘন ঘন কমান্ড

test                                                // run all test
testOnly                                            // run only failed tests
testOnly -- -z "The Hello object should say hello"  // run one specific test
run                                                 // run default main
runMain example.Hello                               // run specific main
clean                                               // delete target/
package                                             // package skinny jar
assembly                                            // package fat jar
publishLocal                                        // library to local cache
release                                             // library to remote repository
reload                                              // after each change to build definition

শাঁস এর অগণিত

scala              // Scala REPL that executes Scala language (nothing to do with sbt)
sbt                // sbt REPL that executes special sbt shell language (not Scala REPL)
sbt console        // Scala REPL with dependencies loaded as per build.sbt
sbt consoleProject // Scala REPL with project definition and sbt loaded for exploration with plain Scala langauage

বিল্ড সংজ্ঞা একটি যথাযথ স্কালাল প্রকল্প

এটি মূল কী ইডিয়োম্যাটিক এসবিটি ধারণাগুলির মধ্যে একটি। আমি একটি প্রশ্ন দিয়ে ব্যাখ্যা করার চেষ্টা করব। বলুন আপনি এমন একটি এসবিটি টাস্ক সংজ্ঞায়িত করতে চান যা স্কেলাজ-HTTP দিয়ে একটি HTTP অনুরোধ কার্যকর করবে। স্বজ্ঞাতভাবে আমরা নিম্নলিখিত ভিতরে চেষ্টা করতে পারেনbuild.sbt

libraryDependencies +=  "org.scalaj" %% "scalaj-http" % "2.4.2"

val fooTask = taskKey[Unit]("Fetch meaning of life")
fooTask := {
  import scalaj.http._ // error: cannot resolve symbol
  val response = Http("http://example.com").asString
  ...
}

তবে এটি অনুপস্থিত বলতে ত্রুটি করবে import scalaj.http._। এ কিভাবে সম্ভব যখন আমরা, ডান সর্বোপরি, যোগ scalaj-httpকরতে libraryDependencies? তদ্ব্যতীত, আমরা যখন নির্ভরতা যুক্ত করি তখন এটি কেন কাজ করে project/build.sbt?

// project/build.sbt
libraryDependencies +=  "org.scalaj" %% "scalaj-http" % "2.4.2"

উত্তরটি হ'ল এটি আপনার মূল প্রকল্প থেকে পৃথক পৃথক স্কালা প্রকল্পেরfooTask একটি অংশ । এই আলাদা স্কালা প্রকল্পটি ডিরেক্টরিতে পাওয়া যাবে যার নিজস্ব ডিরেক্টরি রয়েছে যেখানে এর সংকলিত ক্লাসগুলি থাকে। আসলে, এর অধীনে এমন একটি শ্রেণি থাকা উচিত যা এরকম কোনও কিছুর জন্য ক্ষয় হয়project/target/project/target/config-classes

object $9c2192aea3f1db3c251d extends scala.AnyRef {
  lazy val fooTask : sbt.TaskKey[scala.Unit] = { /* compiled code */ }
  lazy val root : sbt.Project = { /* compiled code */ }
}

আমরা দেখতে পাচ্ছি যে fooTaskকেবলমাত্র একটি নিয়মিত স্কালাল আইটেমটির সদস্য $9c2192aea3f1db3c251d। স্পষ্টতই scalaj-httpপ্রকল্পটি সংজ্ঞায়নের নির্ভরতা হওয়া উচিত $9c2192aea3f1db3c251dএবং সঠিক প্রকল্পের নির্ভরতা নয়। সুতরাং এটির project/build.sbtপরিবর্তে এটি ঘোষণা করা দরকার build.sbt, কারণ projectএখানেই বিল্ড ডেফিনিশন স্কালা প্রকল্প থাকে।

বিন্দুটি নির্ধারণের জন্য যে বিল্ড সংজ্ঞাটি কেবল একটি অন্য স্কাল প্রকল্প, সম্পাদন করুন sbt consoleProject। এটি শ্রেণিপথের বিল্ড সংজ্ঞা প্রকল্পের সাথে স্কালা আরএপিএল লোড করবে। আপনি লাইন লাইন বরাবর একটি আমদানি দেখতে হবে

import $9c2192aea3f1db3c251d

সুতরাং এখন আমরা build.sbtডিএসএল এর পরিবর্তে স্কেল দিয়ে যথাযথ কল করে বিল্ড সংজ্ঞা প্রকল্পের সাথে সরাসরি যোগাযোগ করতে পারি । উদাহরণস্বরূপ, নিম্নলিখিতগুলি কার্যকর করেfooTask

$9c2192aea3f1db3c251d.fooTask.eval

build.sbtআন্ডার রুট প্রকল্প হ'ল একটি স্পিশাল ডিএসএল যা স্কেল প্রকল্পের অধীনে বিল্ড ডেফিনেশন সংজ্ঞায়িত করতে সহায়তা করে project/

এবং বিল্ড ডেফিনিশন স্কালাল প্রকল্প, এর নিজস্ব বিল্ড সংজ্ঞা স্কালা প্রকল্পের অধীনে থাকতে পারে project/project/এবং আরও অনেক কিছু। আমরা বলি এসবিটি পুনরাবৃত্ত হয়

sbt ডিফল্ট সমান্তরাল হয়

sbt কাজগুলি বাইরে DAG তৈরি করে । এটি এটিকে কাজের মধ্যে নির্ভরতা বিশ্লেষণ করতে এবং সমান্তরালভাবে এটিকে কার্যকর করতে এবং এমনকি নকল সম্পাদন করতে সহায়তা করে। build.sbtডিএসএল এটিকে মাথায় রেখে তৈরি করা হয়েছে, যা প্রাথমিকভাবে বিস্ময়কর শব্দার্থক হতে পারে। নিম্নলিখিত স্নিপেটে মৃত্যুদণ্ড কার্যকর করার আদেশটি কী বলে আপনি মনে করেন?

def a = Def.task { println("a") }
def b = Def.task { println("b") }
lazy val c = taskKey[Unit]("sbt is parallel by-default")
c := {
  println("hello")
  a.value
  b.value
}

স্বজ্ঞাতভাবে কেউ মনে করতে পারে যে এখানে প্রবাহ হ'ল প্রথমে মুদ্রণ করা, helloপরে চালানো aএবং তার পরে bটাস্ক। তবে আসলে এই চালানো মানে aএবং bসমান্তরাল , এবং সামনে println("hello") তাই

a
b
hello

বা অর্ডার aএবং bগ্যারান্টিযুক্ত কারণ

b
a
hello

সম্ভবত বিপরীতে, sbt এ সিরিয়াল চেয়ে সমান্তরাল করা সহজ। আপনার যদি ক্রমিক ক্রমের প্রয়োজন হয় তবে আপনাকে বিশেষ জিনিসগুলি ব্যবহার করতে হবে Def.sequentialবা বোঝার জন্যDef.taskDyn অনুকরণ করতে হবে ।

def a = Def.task { println("a") }
def b = Def.task { println("b") }
lazy val c = taskKey[Unit]("")
c := Def.sequential(
  Def.task(println("hello")),
  a,
  b
).value

অনুরূপ

for {
  h <- Future(println("hello"))
  a <- Future(println("a"))
  b <- Future(println("b"))
} yield ()

যেখানে আমরা দেখতে পাই যে উপাদানগুলির মধ্যে কোনও নির্ভরতা নেই il

def a = Def.task { println("a"); 1 }
def b(v: Int) = Def.task { println("b"); v + 40 }
def sum(x: Int, y: Int) = Def.task[Int] { println("sum"); x + y }
lazy val c = taskKey[Int]("")
c := (Def.taskDyn {
  val x = a.value
  val y = Def.task(b(x).value)
  Def.taskDyn(sum(x, y.value))
}).value

অনুরূপ

def a = Future { println("a"); 1 }
def b(v: Int) = Future { println("b"); v + 40 }
def sum(x: Int, y: Int) = Future { x + y }

for {
  x <- a
  y <- b(x)
  c <- sum(x, y)
} yield { c }

যেখানে আমরা দেখতে sumউপর নির্ভর করে এবং জন্য অপেক্ষা করতে হয়েছে aএবং b

অন্য কথায়

  • জন্য আবেদন শব্দার্থবিদ্যা, ব্যবহার.value
  • জন্য কীটাণুজাতীয় শব্দার্থবিদ্যা ব্যবহার sequentialবাtaskDyn

এর পরিবর্তে যেখানে নির্ভরতা বাড়ানোর প্রকৃতির ফলস্বরূপ অন্য শব্দার্থগত বিভ্রান্তি স্নিপেট বিবেচনা করুনvalue

`value` can only be used within a task or setting macro, such as :=, +=, ++=, Def.task, or Def.setting.
val x = version.value
                ^

আমাদের লিখতে হবে

val x = settingKey[String]("")
x := version.value

দ্রষ্টব্য নোটটি .valueডাগের সম্পর্কের বিষয়ে এবং এর অর্থ এই নয়

"এখনই আমাকে মূল্য দিন"

পরিবর্তে এটি কিছু ভালো মানে

"আমার কলারটি প্রথমে আমার উপর নির্ভর করে এবং আমি যখন পুরো ডিএজি একসাথে ফিট করে তা জানতে পারি, তখন আমি আমার কলারকে অনুরোধ করা মান সরবরাহ করতে সক্ষম হবো"

সুতরাং এখন এটি আরও পরিষ্কার হতে পারে কেন xএখনও কোনও মূল্য নির্ধারণ করা যায় না; সম্পর্ক স্থাপনের পর্যায়ে এখনও কোনও মূল্য উপলব্ধ নেই।

আমরা স্কেল যথাযথ এবং ডিএসএল ভাষার মধ্যে শব্দার্থের পার্থক্য স্পষ্ট দেখতে পাচ্ছি build.sbt। থাম্বসের কয়েকটি নিয়ম এখানে আমার জন্য কার্যকর

  • ডিএজি বিভিন্ন ধরণের অভিব্যক্তি তৈরি করে তৈরি করা হয় Setting[T]
  • বেশিরভাগ ক্ষেত্রে আমরা কেবল .valueসিনট্যাক্স ব্যবহার করি এবং এসবিটি এর মধ্যে সম্পর্ক স্থাপনের যত্ন নেবেSetting[T]
  • মাঝেমধ্যে আমাদের ডিএজি-র একটি অংশ ম্যানুয়ালি মুছে ফেলা হয় এবং তার জন্য আমরা ব্যবহার করি Def.sequentialবা করিDef.taskDyn
  • এই অর্ডারিং / রিলেশনশিটির সিনট্যাটিক বৈষম্যগুলির যত্ন নেওয়া হয়ে গেলে, আমরা কাজগুলির বাকী ব্যবসায়ের লজিক তৈরির জন্য সাধারণ স্কালা শব্দার্থবিজ্ঞানের উপর নির্ভর করতে পারি।

 কমান্ড বনাম টাস্ক

কমান্ডগুলি ডিএজি থেকে বেরিয়ে আসা অলস উপায়। কমান্ডগুলি ব্যবহার করে বিল্ডের অবস্থা এবং আপনার ইচ্ছামতো ক্রিয়াকলাপগুলি কার্যকর করা সহজ। ব্যয়টি হ'ল আমরা ডিএজি কর্তৃক প্রদত্ত কার্যগুলির সমান্তরালতা এবং প্রতিলিপিটি looseিলে .ালা করে রাখি, কোন ধরণের কাজগুলি পছন্দসই পছন্দ হওয়া উচিত। আপনি কমান্ডগুলি কোনও ধরণের স্থায়ী রেকর্ডিং হিসাবে বিবেচনা করতে পারেন যা কোনও অভ্যন্তরে করতে পারে sbt shell। উদাহরণস্বরূপ, দেওয়া

vval x = settingKey[Int]("")
x := 13
lazy val f = taskKey[Int]("")
f := 1 + x.value

নিম্নলিখিত সেশনের আউটপুট বিবেচনা করুন

sbt:root> x
[info] 13
sbt:root> show f
[info] 14
sbt:root> set x := 41
[info] Defining x
[info] The new value will be used by f
[info] Reapplying settings...
sbt:root> show f
[info] 42

বিশেষত আমরা কীভাবে বিল্ডের অবস্থাটি পরিবর্তিত করব তা নয় set x := 41। আদেশগুলি উদাহরণস্বরূপ, উপরের সেশনের স্থায়ী রেকর্ডিং করতে সক্ষম করে

commands += Command.command("cmd") { state =>
  "x" :: "show f" :: "set x := 41" :: "show f" :: state
}

আমরা কমান্ডটি টাইপ-নিরাপদ ব্যবহার করে Project.extractএবং করতে পারিrunTask

commands += Command.command("cmd") { state =>
  val log = state.log
  import Project._
  log.info(x.value.toString)
  val (_, resultBefore) = extract(state).runTask(f, state)
  log.info(resultBefore.toString)
  val mutatedState = extract(state).appendWithSession(Seq(x := 41), state)
  val (_, resultAfter) = extract(mutatedState).runTask(f, mutatedState)
  log.info(resultAfter.toString)
  mutatedState
}

স্কোপস

যখন আমরা নিম্নলিখিত ধরণের প্রশ্নের উত্তর দেওয়ার চেষ্টা করি তখন স্কোপগুলি কার্যকর হয়

  • কীভাবে একবার টাস্কটি সংজ্ঞায়িত করা যায় এবং মাল্টি-প্রজেক্ট বিল্ডে সমস্ত উপ-প্রকল্পগুলিতে এটি উপলব্ধ করা যায়?
  • মূল ক্লাসপথে পরীক্ষার নির্ভরতা এড়ানো কীভাবে?

এসবিটিতে একটি মাল্টি-অক্ষ স্কোপিং স্পেস রয়েছে যা স্ল্যাশ সিনট্যাক্স ব্যবহার করে নেভিগেট করা যায় , উদাহরণস্বরূপ,

show  root   /  Compile         /  compile   /   scalacOptions
        |        |                  |             |
     project    configuration      task          key

ব্যক্তিগতভাবে, আমি নিজেকে খুব কমই সুযোগ সম্পর্কে চিন্তা করতে দেখি। কখনও কখনও আমি কেবল পরীক্ষার উত্সগুলি সংকলন করতে চাই

Test/compile

বা সম্ভবত কোনও প্রকল্পের সাথে নেভিগেট না করেই কোনও নির্দিষ্ট সাবপ্রজেক্ট থেকে একটি নির্দিষ্ট কাজ সম্পাদন করুন project subprojB

subprojB/Test/compile

আমি মনে করি থাম্বের নিম্নলিখিত নিয়মগুলি স্কোপিং জটিলতা এড়াতে সহায়তা করে

  • build.sbtরুট প্রকল্পের অধীনে একাধিক ফাইল নেই তবে কেবলমাত্র একক মাস্টার যা অন্য সমস্ত উপ-প্রকল্পগুলি নিয়ন্ত্রণ করে
  • অটো প্লাগইনগুলির মাধ্যমে কাজগুলি ভাগ করুন
  • সাধারণ সেটিংসকে সরল স্কেলে ফ্যাক্ট valকরুন এবং স্পষ্টভাবে প্রতিটি উপ-প্রকল্পে এটি যুক্ত করুন

বহু প্রকল্প নির্মাণ

প্রতিটি সাবপ্রজেক্টের জন্য একাধিক বিল্ড.এসবিটি ফাইলের আইন্সটেড

.
├── README.md
├── build.sbt                  // OK
├── multi1
│   ├── build.sbt              // NOK
│   ├── src
│   └── target
├── multi2
│   ├── build.sbt              // NOK
│   ├── src
│   └── target
├── project                    // this is the meta-project
│   ├── FooPlugin.scala        // custom auto plugin
│   ├── build.properties       // version of sbt and hence Scala for meta-project
│   ├── build.sbt              // OK - this is actually for meta-project 
│   ├── plugins.sbt            // OK
│   ├── project
│   └── target
└── target

build.sbtতাদের সকলকে শাসন করার জন্য একক মাস্টার থাকুন

.
├── README.md
├── build.sbt                  // single build.sbt to rule theme all
├── common
│   ├── src
│   └── target
├── multi1
│   ├── src
│   └── target
├── multi2
│   ├── src
│   └── target
├── project
│   ├── FooPlugin.scala
│   ├── build.properties
│   ├── build.sbt
│   ├── plugins.sbt
│   ├── project
│   └── target
└── target

বহু-প্রকল্পের বিল্ডগুলিতে সাধারণ সেটিংস ফ্যাক্টর করার একটি প্রচলিত অনুশীলন রয়েছে

একটি ভালে সাধারণ সেটিংসের ক্রম সংজ্ঞায়িত করুন এবং প্রতিটি প্রকল্পে এগুলি যুক্ত করুন। সেভাবে শেখার জন্য কম ধারণা।

উদাহরণ স্বরূপ

lazy val commonSettings = Seq(
  scalacOptions := Seq(
    "-Xfatal-warnings",
    ...
  ),
  publishArtifact := true,
  ...
)

lazy val root = project
  .in(file("."))
  .settings(settings)
  .aggregate(
    multi1,
    multi2
  )
lazy val multi1 = (project in file("multi1")).settings(commonSettings)
lazy val multi2 = (project in file("multi2")).settings(commonSettings)

প্রকল্প নেভিগেশন

projects         // list all projects
project multi1   // change to particular project

প্লাগইনস

মনে রাখবেন বিল্ড সংজ্ঞাটি একটি যথাযথ স্কালাল প্রকল্প যা এর অধীনে থাকে project/। এখানে আমরা .scalaফাইল তৈরি করে একটি প্লাগইন সংজ্ঞায়িত করি

.                          // directory of the (main) proper project
├── project
│   ├── FooPlugin.scala    // auto plugin
│   ├── build.properties   // version of sbt library and indirectly Scala used for the plugin
│   ├── build.sbt          // build definition of the plugin
│   ├── plugins.sbt        // these are plugins for the main (proper) project, not the meta project
│   ├── project            // the turtle supporting this turtle
│   └── target             // compiled binaries of the plugin

এখানে একটি সংক্ষিপ্ত স্বয়ংক্রিয় প্লাগইন অধীনেproject/FooPlugin.scala

object FooPlugin extends AutoPlugin {
  object autoImport {
      val barTask = taskKey[Unit]("")
  }

  import autoImport._

  override def requires = plugins.JvmPlugin  // avoids having to call enablePlugin explicitly
  override def trigger = allRequirements

  override lazy val projectSettings = Seq(
    scalacOptions ++= Seq("-Xfatal-warnings"),
    barTask := { println("hello task") },
    commands += Command.command("cmd") { state =>
      """eval println("hello command")""" :: state
    }   
  )
}

ওভাররাইড

override def requires = plugins.JvmPlugin

কার্যকরভাবে স্পষ্টভাবে কল করেও সমস্ত উপ-প্রকল্পের প্লাগইন সক্রিয় করা উচিত enablePluginমধ্যে build.sbt

ইন্টেলিজ এবং এসবিটি

নিম্নলিখিত সেটিংস সক্ষম করুন (যা সত্যই ডিফল্ট দ্বারা সক্ষম করা উচিত )

use sbt shell

অধীনে

Preferences | Build, Execution, Deployment | sbt | sbt projects

মূল তথ্যসূত্র

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.