Sbtμ κ²μ λͺ¨λΈμ μμ ν λͺ ννμ§ μμ μ΄μ λ‘ GitHub ν¨ν€μ§μμ μλνμ§ μλ κ²μΌλ‘ 보μ λλ€. μ΄ νΈμ μ μ΄κ²μ΄ μλ €μ§ λ¬Έμ μ΄κ±°λ μ΅μν μμ ν μμμΉ λͺ»ν κ²μ μλμ μμνλ κ² κ°μ΅λλ€. GitHubκ° sbtμ λν μ§μμ μΆκ°νκ±°λ μ΅μν μ€λ¨μ μ€λ¨νλ©΄ μ΄ λ¬Έμ λ₯Ό μ’ λ£νκ³ μλ μ€μΈ νλ¬κ·ΈμΈμ μ μ ν 릴리μ€λ₯Ό μνν κ²μ λλ€.
κΈ°λ‘μ μν΄ μ€λ₯λ λ€μκ³Ό κ°μ΅λλ€.
[info] [info] Set current project to sbt-github-packages-tests-publish (in build file:/private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/)
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT-sources.jar ...
[info] [info] Updating ...
[info] [info] Done packaging.
[info] [info] Wrote /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.pom
[info] [info] Done updating.
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT-javadoc.jar ...
[info] [info] Done packaging.
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.jar ...
[info] [info] Done packaging.
[info] [info] published sbt-github-packages-tests-publish_2.12 to https://maven.pkg.github.com/djspiewak/sbt-github-packages/com/codecommit/sbt-github-packages-tests-publish_2.12/0.1-SNAPSHOT/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.pom
[info] [error] java.io.IOException: Access to URL https://maven.pkg.github.com/djspiewak/sbt-github-packages/com/codecommit/sbt-github-packages-tests-publish_2.12/0.1-SNAPSHOT/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.jar was refused by the server: Forbidden
[info] [error] at org.apache.ivy.util.url.AbstractURLHandler.validatePutStatusCode(AbstractURLHandler.java:79)
[info] [error] at sbt.internal.librarymanagement.ivyint.GigahorseUrlHandler.upload(GigahorseUrlHandler.scala:191)
[info] [error] at org.apache.ivy.util.url.URLHandlerDispatcher.upload(URLHandlerDispatcher.java:82)
[info] [error] at org.apache.ivy.util.FileUtil.copy(FileUtil.java:150)
[info] [error] at org.apache.ivy.plugins.repository.url.URLRepository.put(URLRepository.java:84)
[info] [error] at sbt.internal.librarymanagement.ConvertResolver$LocalIfFileRepo.put(ConvertResolver.scala:366)
[info] [error] at org.apache.ivy.plugins.repository.AbstractRepository.put(AbstractRepository.java:130)
[info] [error] at sbt.internal.librarymanagement.ConvertResolver$ChecksumFriendlyURLResolver.put(ConvertResolver.scala:118)
[info] [error] at sbt.internal.librarymanagement.ConvertResolver$ChecksumFriendlyURLResolver.put$(ConvertResolver.scala:105)
[info] [error] at sbt.internal.librarymanagement.ConvertResolver$$anonfun$defaultConvert$lzycompute$1$PluginCapableResolver$1.put(ConvertResolver.scala:165)
[info] [error] at org.apache.ivy.plugins.resolver.RepositoryResolver.publish(RepositoryResolver.java:216)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$5(IvyActions.scala:497)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$5$adapted(IvyActions.scala:496)
[info] [error] at scala.collection.TraversableLike$WithFilter.$anonfun$foreach$1(TraversableLike.scala:788)
[info] [error] at scala.collection.Iterator.foreach(Iterator.scala:937)
[info] [error] at scala.collection.Iterator.foreach$(Iterator.scala:937)
[info] [error] at scala.collection.AbstractIterator.foreach(Iterator.scala:1425)
[info] [error] at scala.collection.IterableLike.foreach(IterableLike.scala:70)
[info] [error] at scala.collection.IterableLike.foreach$(IterableLike.scala:69)
[info] [error] at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
[info] [error] at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:787)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.publish(IvyActions.scala:496)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$3(IvyActions.scala:144)
[info] [error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.withChecksums(IvyActions.scala:157)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.withChecksums(IvyActions.scala:151)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$1(IvyActions.scala:144)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$1$adapted(IvyActions.scala:134)
[info] [error] at sbt.internal.librarymanagement.IvySbt$Module.$anonfun$withModule$1(Ivy.scala:239)
[info] [error] at sbt.internal.librarymanagement.IvySbt.$anonfun$withIvy$1(Ivy.scala:204)
[info] [error] at sbt.internal.librarymanagement.IvySbt.sbt$internal$librarymanagement$IvySbt$$action$1(Ivy.scala:70)
[info] [error] at sbt.internal.librarymanagement.IvySbt$$anon$3.call(Ivy.scala:77)
[info] [error] at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:95)
[info] [error] at xsbt.boot.Locks$GlobalLock.xsbt$boot$Locks$GlobalLock$$withChannelRetries$1(Locks.scala:80)
[info] [error] at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:99)
[info] [error] at xsbt.boot.Using$.withResource(Using.scala:10)
[info] [error] at xsbt.boot.Using$.apply(Using.scala:9)
[info] [error] at xsbt.boot.Locks$GlobalLock.ignoringDeadlockAvoided(Locks.scala:60)
[info] [error] at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:50)
[info] [error] at xsbt.boot.Locks$.apply0(Locks.scala:31)
[info] [error] at xsbt.boot.Locks$.apply(Locks.scala:28)
[info] [error] at sbt.internal.librarymanagement.IvySbt.withDefaultLogger(Ivy.scala:77)
[info] [error] at sbt.internal.librarymanagement.IvySbt.withIvy(Ivy.scala:199)
[info] [error] at sbt.internal.librarymanagement.IvySbt.withIvy(Ivy.scala:196)
[info] [error] at sbt.internal.librarymanagement.IvySbt$Module.withModule(Ivy.scala:238)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.publish(IvyActions.scala:134)
[info] [error] at sbt.Classpaths$.$anonfun$publishTask$4(Defaults.scala:2416)
[info] [error] at sbt.Classpaths$.$anonfun$publishTask$4$adapted(Defaults.scala:2416)
[info] [error] at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[info] [error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[info] [error] at sbt.std.Transform$$anon$4.work(System.scala:67)
[info] [error] at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[info] [error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[info] [error] at sbt.Execute.work(Execute.scala:278)
[info] [error] at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[info] [error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[info] [error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[info] [error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info] [error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[info] [error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info] [error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[info] [error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[info] [error] at java.lang.Thread.run(Thread.java:748)
μλ¨μ 보면 pomμ΄ μ±κ³΅μ μΌλ‘ κ²μλμμ§λ§ 첫 λ²μ§Έ jar νμΌμ΄ Forbidden
μ ν¨κ» κ±°λΆλμμμ μ μ μμ΅λλ€. @alexarchambalt λ κ²μ μμκ° κ΄λ ¨μ΄ μμΌλ©° νμ리λ κ΄κ³μμ΄ κ±°λΆλλ€κ³ λ³΄κ³ ν©λλ€.
λ΄κ° λ§ν μμλ ν -sources, -javadoc, -testsλ μ§μλμ§ μμ΅λλ€.
sbt-aether-deployλ₯Ό μ¬μ©νμ¬ sbtμμ github ν¨ν€μ§μ μ±κ³΅μ μΌλ‘ κ²μνμ΅λλ€.
νλ‘μ νΈ/plugins.sbt
addSbtPlugin("no.arktekk.sbt" % "aether-deploy" % "0.23.0")
addSbtPlugin("com.dwijnand" % "sbt-dynver" % "4.0.0")
λΉλ.sbt
externalResolvers += "GitHub lokkju Apache Maven Packages" at "https://maven.pkg.github.com/lokkju/github-action-sbt"
publishTo := Some("GitHub lokkju Apache Maven Packages" at "https://maven.pkg.github.com/lokkju/github-action-sbt")
credentials += Credentials("GitHub Package Registry", "maven.pkg.github.com", "lokkju", "<GITHUB_TOKEN>")
// GitHub package repo isn't supporting javadoc and sources
publishArtifact in (Compile, packageDoc) := false
publishArtifact in (Compile, packageSrc) := false
sbt aetherDeploy
μΆκ° μΈ‘λ©΄; Charles Web Debugging Proxyλ₯Ό μ¬μ©νλ©΄ λͺ¨λ κ²μ΄ μ μλν©λλ€. κ·Έκ² μμ΄λ λλλ‘ μλ²κ° μλ΅νμ§ μλλ€λ μ€λ₯κ° λ°μν©λλ€.
@lokkju ν , λ€μ€ λͺ¨λ λΉλλ μ΄λ»μ΅λκΉ?
λλ κ·Έλ€μ μλνμ§ μμμ΅λλ€. key hereμ ether-deployλ₯Ό μ¬μ©νλ κ² κ°μ§λ§ μμ ν μμ λμ§λ μμ΅λλ€. κ° λꡬμμ μ¬μ©νλ ν΄λΌμ΄μΈνΈ λ²μ μ SSL μ§μ λ¬Έμ μΈ κ² κ°μ΅λλ€.
λͺ κ°μ§ λ€λ₯Έ Java http λΌμ΄λΈλ¬λ¦¬λ₯Ό μλνκ³ κ°λ¨ν μλ ꡬμ±κ³Ό μλνμ§ μλ ꡬμ±μ λ체ν μ μλμ§ νμΈνκ² μ΅λλ€. μ΅μ μ 보λ₯Ό μλ € λλ¦¬κ² μ΅λλ€.
κ·Έλμ μ’ λ νμν λμ λͺ κ°μ§ ν₯λ―Έλ‘μ΄ μ¦μμ λ°κ²¬νμ΅λλ€.
curlμ μ¬μ©νμ¬ ν¨ν€μ§λ₯Ό μ λ‘λνλ €κ³ νμ΅λλ€.
νμ¬ μ€μν μ μ JAR μν°ν©νΈλ₯Ό λ¨Όμ μ λ‘λν λ€μ POMμ κ²μν΄μΌ νλ€λ κ²μ λλ€.
μ§μ μ΄λ©μΌμ΄ μμ΅λλ€. μΆκ° μ 보λ₯Ό μ 곡νλμ§ νμΈνκ² μ΅λλ€.
ν κ·ΈλΌ μν°ν©νΈ μλͺ λ μλ 건κ°μ?
μ λ‘λλ λͺ¨λ νμΌμ λν΄ *.md5 λ° *.sha1μ μλμΌλ‘ μμ±ν©λλ€.
λν λ€μμ μ°Ύμμ΅λλ€. https://github.com/sbt/librarymanagement/blob/d09f9f81b664baaac15054730fbcb51e1b240de2/ivy/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala#L123
Artifactory deals with the publishing (and republishing) of SNAPSHOTs using a strict rule on the order of publishing. The ;build.timestamp=... suffix is the alternative.
The strict rule is:
publish the main artefact (which has no classifier)
publish the POM/ivy.xml file
publish additional artefacts which have a classifier
μ§κΈκΉμ§ λΆλ₯κΈ°λ₯Ό λ°°ν¬ν μ μλ κ² κ°μ΅λλ€. μ΄λ μ±κ°μ μΌμ΄λ©° githubμ λν μ§λ¬Έμ μΌλΆμ λλ€.
λλ μλ§λ μμν maven/java νλ‘μ νΈλ₯Ό λ§λ€κ³ κ·Έκ²μ΄ μλνλμ§ νμΈν κ²μ λλ€.
κΈ°λ³Έ κ²μλ₯Ό μ¬μ©νμ¬ μ€λ μ· λ°°ν¬λ₯Ό μλνκ³ λ€μμ μ»μμ΅λλ€.
[error] stack trace is suppressed; run last publish for the full output
[error] (publish) java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/3.24.0-SNAPSHOT/utils-3.24.0-SNAPSHOT.pom failed with status code 400: Bad Request
λ¬Έμμ μ€λ μ·μ λν μΈκΈ μμ
μ¬μ€ λλ μΌλ° ν¨ν€μ§μ λμΌν©λλ€.
java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/utils/0.0.1/utils-0.0.1.pom failed with status code 400: Bad Request
[error] java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/utils/0.0.1/utils-0.0.1.pom failed with status code 400: Bad Request
[error] at org.apache.ivy.util.url.AbstractURLHandler.validatePutStatusCode(AbstractURLHandler.java:82)
[error] at org.apache.ivy.util.url.BasicURLHandler.upload(BasicURLHandler.java:264)
[error] at org.apache.ivy.util.url.URLHandlerDispatcher.upload(URLHandlerDispatcher.java:82)
[error] at org.apache.ivy.util.FileUtil.copy(FileUtil.java:150)
κ·Έ 400μ λͺΈμ΄ μ΄λ»κ² μκ²Όλμ§ κΆκΈνλ€
μ΄μ λν μ λ°μ΄νΈκ° μμ΅λκΉ?
μμ§ μ λ°μ΄νΈκ° μμ΅λλ€! @lokkju μ μ€νμ΄ κ°μ₯ μ΅κ·Όμ κ² κ°μμ. μ’ λ κ°μ§κ³ λκ³ μΆμ§λ§ μμ§ν GitHub ν¨ν€μ§λ μ¬μ ν νμ€ Maven λ°°ν¬ κ°λ₯ νμΌ(μλͺ , λ¬Έμ, λΆλ₯μ λ±)μ μΌλΆμ΄μ μν¬μΈ νΈμ€ν νμΌμ μ§μνμ§ μλ κ² κ°μ΅λλ€. μ΄λ¬ν κ²°ν¨μ μμ ν λκΉμ§ μν°ν©νΈ νΈμ€νΈλ‘ μ€μ©μ μΈ μμ μ μννκΈ°κ° μ΄λ ΅μ΅λλ€.
μΆκ° μ 보, μΌλ° sbt 1.3.2
λ‘ ν
μ€νΈ(μΆκ° νλ¬κ·ΈμΈ μμ)
νλ‘μ νΈμ 리ν¬μ§ν 리μ κ²μν΄μΌ ν©λλ€.
publishTo := Some("GitHub Package Registry" at "https://maven.pkg.github.com/[username]/[project]")
μ격 μ¦λͺ μ λ€μκ³Ό κ°μ΄ μ μλμ΄μΌ ν©λλ€.
credentials += Credentials("GitHub Package Registry","maven.pkg.github.com","[username]","[token]")
ν ν°μλ read:packages
, repo
λ° write:packages
λ²μκ° νμν©λλ€.
κ·Έλ¬λ μΌλ¨ κ²μνλ©΄ μ΄λ¬ν μ μλ ν¨ν€μ§ μ’ν(μ¬κΈ°μ organization="io.test" λ° name="test")λ‘ λλ©λλ€.
<dependency>
<groupId>com.github.[username]/[project]</groupId>
<artifactId>io.test.test_2.13</artifactId>
<version>0.1</version>
</dependency>
μ€λ μ·μ μ λ‘λν μ μμ§λ§ λ λ² μ λ‘λν μ μμΌλ―λ‘ νΉλ³ν μ²λ¦¬κ° μμ μ μμ΅λλ€.
Pom μ λ‘λλ μλνμ§λ§ λλ¨Έμ§λ μ€ν¨ν©λλ€.
[μ 보] https://maven.pkg.github.com/[username]/[project]/io/test/test_2.13/0.0.3/test_2.13-0.0.3.pom μ test_2.13 κ²μ
[μ€λ₯] java.io.IOException: URL https://maven.pkg.github.com/[username]/[project]/io/test/test_2.13/0.0.3/test_2.13-0.0 μ λν μ‘μΈμ€. 3.jarμ΄ μλ²μμ κ±°λΆλμμ΅λλ€. κΈμ§λ μλ΅=μ€λ₯: "io.test.test_2.13" λ²μ 0.0.3μ "test_2.13-0.0.3.jar"μ΄ μ΄λ―Έ κ²μλμμ΅λλ€.
@francisdb JAR μ λ‘λλ SBTκ° νμΌμ μμλλ‘ μ λ‘λνμ§ μκΈ° λλ¬Έμ μ€ν¨ν©λλ€. λ΄κ° κΈ°μ΅νλ λ°μ λ°λ₯΄λ©΄ κ²μ κΈ°λ₯μ΄ seq μ ν λμ μ§λ μ νμ μ¬μ©νλ SBT(IvyActions.scala)μ μ€λ λ²κ·Έμ λλ€. Coursier μ’ μμ± κ΄λ¦¬ μμ€ν μΌλ‘ μ΄λνλ©΄ μ΄ λ¬Έμ κ° μ체μ μΌλ‘ ν΄κ²°λ μ μμ΅λλ€.
λ΄ μ μμ μ΄ νλ¬κ·ΈμΈ λ΄μμ μ λ‘λ νλ‘μΈμ€ μ체λ₯Ό 무μνκ³ pomμ λ¨Όμ μ λ‘λνλ κ²μ λλ€. λ¬Όλ‘ μ΄κ²μ μ¬μ ν ββμ§μμ΄ νμν λΆλ₯κΈ°μλ λμμ΄ λμ§ μμ΅λλ€.
sbt 1.3.2μμμ²λΌ 보μ λλ€. Cousierλ μν°ν©νΈλ₯Ό μ λ‘λνλ λ° μ¬μ©λμ§ μκ³ λ€μ΄λ‘λμλ§ μ¬μ©λ©λλ€.
λν μ΄ λ¬Έμ μ λν GitHubμ μλ΅μ΄ μμ΅λλ€.
ν ... μμ£Ό κ°λ¨ν λ΄€μ΅λλ€. sbt 1.2.8μ μ¬μ ν ββλͺ¨λ κ³³μμ μ¬μ©λ©λλ€.
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/build.sbt#L28
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/src/sbt-test/sbtghpackages/publish/project/build.properties#L1
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/project/build.properties#L1
(μΌλΆλ λμ³€μ μλ μμ§λ§)
μ κ·Έλ μ΄λκ° νμνκ°μ?
ν 리νμ€νΈ: #2
Cousierλ sbt 1.3.0λΆν° κΈ°λ³Έμ μΌλ‘λ§ μ¬μ©λ©λλ€.
λ΄ ν
μ€νΈλ 1.3.2
@francisdb μκ² μ΅λλ€.
Githubμ΄ λͺ κ°μ§λ₯Ό λ³κ²½ν κ² κ°μ΅λλ€. μ€λ μ 체 μ λ‘λλ₯Ό ν μ μμμ΅λλ€. (λ°λλΌ sbt 1.3.3)
[info] published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9.pom
[info] published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9.jar
[info] published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9-sources.jar
[info] published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9-javadoc.jar
μΉ UIλ μ¬μ ν sbt μ λ―Έμ¬μ λν΄ νΌλμ€λ¬μν©λλ€.
<dependency>
<groupId>com.example.test_2</groupId>
<artifactId>13</artifactId>
<version>0.0.9</version>
</dependency>
μ λλ€! μ€λ λͺ κ°μ§ ν μ€νΈλ₯Ό μννκ³ μ’ λ£ν μ μλμ§ νμΈν©λλ€. λ§€μ° λ§€μ° ν₯λ―Έμ§μ§ν©λλ€.
@francisdb μ μ€ν κ²°κ³Όλ₯Ό μ¬μ©νκΈ° μν΄ νλ¬κ·ΈμΈμ μ½κ° μμ νλ©΄ λͺ¨λ κ²μ΄ μλνκ³ μμμ νμΈν μ μμ΅λλ€! κ΅μ°¨ λΉλ μ λ―Έμ¬μ κ΄λ ¨λ webui λ¬Έμ λ μ€μ ν΄μλμ μν₯μ λ―ΈμΉμ§ μκ³ UIμλ§ μν₯μ λ―ΈμΉλ κ²μΌλ‘ 보μ λλ€. λ°λΌμ μ΄μ κ²μ λ° ν΄κ²°μ΄ νλ¬κ·ΈμΈκ³Ό ν¨κ» μλν©λλ€. μμ§ κ°μΈ μ μ₯μλ‘ ν μ€νΈνμ§ μμμ΅λλ€. λ΄ μκ°μλ μμ§ μ λλ‘ μλνμ§ μλ κ² κ°μ§λ§ 0.1.0 μ κ²μνκΈ°μ μΆ©λΆν©λλ€.
λͺ¨λ λ Έλ ₯κ³Ό μ€νμ κ°μ¬λ립λλ€! νλ¬κ·ΈμΈμ μ¬λ¬λΆ λλΆμ λ§€μ° κ°λ¨ν©λλ€.
@francisdb
μ€λ μ·μ μ λ‘λν μ μμ§λ§ λ λ² μ λ‘λν μ μμΌλ―λ‘ νΉλ³ν μ²λ¦¬κ° μμ μ μμ΅λλ€.
λ λ² μ λ‘λν μ μμ΅λλ€.: GitHub UIμμ μ€λ μ·μ μμ ν λ€μ μ μ€λ μ·(λμΌν μ€λ μ· λ²μ μ μλ―Έ)μ λ€μ μ λ‘λν μ μμ΅λλ€. κ·Έκ²μ λλ₯Ό μν΄ μΌνμ΅λλ€. μ½κ° λ²κ±°λ‘μ§λ§ μλν©λλ€.
κ°μ₯ μ μ©ν λκΈ
Githubμ΄ λͺ κ°μ§λ₯Ό λ³κ²½ν κ² κ°μ΅λλ€. μ€λ μ 체 μ λ‘λλ₯Ό ν μ μμμ΅λλ€. (λ°λλΌ sbt 1.3.3)
μΉ UIλ μ¬μ ν sbt μ λ―Έμ¬μ λν΄ νΌλμ€λ¬μν©λλ€.