2016-07-06 5 views
5

(длинный вопрос вперед. Упрощенный tl; dr внизу).Использование зависимостей между двумя проектами ScalaJS SBT

У меня есть два ScalaJS проектов, построенных с SBT - "MyApp" и "MyLib", в следующей структуре каталогов

root/build.sbt 

root/myapp/build.sbt 
root/myapp/jvm/ 
root/myapp/js/ 
root/myapp/shared/ 

root/mylib/build.sbt 
root/mylib/jvm 
root/mylib/js 
root/mylib/shared 

lib экспортирует артефакт под названием "com.example: MyLib: 0,1", который, как используется как libraryDependency для myapp.

myapp и mylib находятся в отдельных хранилищах, содержат свои собственные файлы сборки и должны быть способны быть полностью раздельными (то есть они должны содержать собственную конфигурацию собственной сборки).

В производстве они будут построены отдельно с mylib, которые будут опубликованы в качестве артефакта maven перед зданием myapp отдельно.

В разработке, однако, я хочу, чтобы иметь возможность объединить их в родительский проект SBT, чтобы оба варианта могли быть разработаны параллельно, без необходимости использования publishLocal после каждого изменения. Проект

В традиционной (не scalajs) это было бы довольно легко

$ROOT/build.sbt: 

lazy val mylib = project 
lazy val myapp = project.dependsOn(mylib) 

Однако в ScalaJS, мы на самом деле есть два проекта, внутри каждого модуля - appJVM, appJS, libJVM и libJS. Таким образом, приведенная выше конфигурация только находит общий проект корня и неправильно применяет конфигурацию dependsOn к фактическим проектам JVM и JS.

(т.е. MyApp и MyLib build.sbt каждый из которых содержит два проекта, и совокупный корень проекта)

В идеале я хотел бы быть в состоянии сделать что-то вроде следующего

lazy val mylibJVM = project 
lazy val myappJVM = project.dependsOn(mylibJVM) 

lazy val mylibJS = project 
lazy val myappJS = project.dependsOn(myappJS) 

К сожалению, этот просто создает новые проекты внутри корня вместо импорта самих подпроектов.

Я также пробовал различные комбинации путей (например)

lazy val mylibJVM = project.in(file("mylib/jvm")) 

Но это не видит конфигурации в файле build.sbt в mylib

В конце концов я продолжаю сталкиваясь с той же проблема - при импорте существующего многопроектного проекта SBT в родительский файл sbt он импортирует корневой проект, но, похоже, не предоставляет способ импортировать подпроект из существующего многомодового файла SBT таким образом, чтобы я мог добавить конфигурацию dependsOn к нему.

Т.Л., др

Если у меня есть

  • root/mylib/build.sbt с несколькими проектами, определенных и
  • root/myapp/build.sbt с несколькими проектами, определенных

Можно ли импортировать отдельные подпроекты в root/build.sbt вместо корневого проекта из подмодуля?

Возможно, у меня есть два уровня многопроектных сборок.

+0

Мои scalajs и SBT знания ровно год, и я не знаю, когда раскол между JVM и JS была введена для scalajs проектов, или даже то, что это означает, но с моим плагином 0.6.4, я хотел бы сделать это: 1) Создайте задачу копир, которая зависит от fastOptJs задачи Lib и копии выхода из Lib к приложению 2) сделать fastOptJs задачу приложения зависят от этого Позвольте мне знать, если это частично помогает в этом случае я может попытаться помочь больше. – 0fnt

ответ

0

Проведя много времени, пробираясь через исходный код SBT, мне удалось найти решение. Это не чисто, но это работает. (Для бонусных очков он правильно импортирует IntelliJ).

// Add this function to your root build.sbt file. 
// It can be used to define a dependency between any 
// `ProjectRef` without needing a full project definition. 
def addDep(from:String, to:String) = { 
    buildDependencies in Global <<= (
    buildDependencies in Global, 
    thisProjectRef in from, 
    thisProjectRef in to) { 
    (deps, fromref, toref) => 
     deps.addClasspath(fromref, ResolvedClasspathDependency(toref, None)) 
    } 
} 

// `project` will import the `build.sbt` file 
// in the subdirectory of the same name as the `lazy val` 
// (performed by an SBT macro). i.e. `./mylib/build.sbt` 
// 
// This won't reference the actual subprojects directly, 
// will but import them into the namespace such that they 
// can be referenced as "ProjectRefs", which are implicitly 
// converted to from strings. 
// 
// We then aggregate the JVM and JS ScalaJS projects 
// into the new root project we've defined. (Which unfortunately 
// won't inherit anything from the child build.sbt) 

lazy val mylib = project.aggregate("mylibJVM","mylibJS") 
lazy val myapp = project.aggregate("myappJVM","myappJS") 

// Define a root project to aggregate everything 
lazy val root = project.in(file(".")).aggregate(mylib,myapp) 


// We now call our custom function to define a ClassPath dependency 
// between `myapp` -> `mylib` for both JVM and JS subprojects. 
// In particular, this will correctly find exported artifacts 
// so that `myapp` can refer to `mylib` in libraryDependencies 
// without needing to use `publishLocal`. 
addDep("myappJVM", "mylibJVM") 
addDep("myappJS","mylibJS") 
Смежные вопросы