SBT ve IntelliJ IDEA ile birden fazla birbirine bağlı modül nasıl yönetilir?


82

Aralarında bağımlılıklar olan birkaç modül geliştiriyorum ve hepsiyle tek bir IDEA projesinde çalışmak istiyorum. Bireysel projeler için harika çalışan sbt yapı tanımlarından IDEA projeleri oluşturmak için sbt-idea kullanıyorum . Ancak çoklu modül durumunda şu ana kadar denediğim şeyler pek işe yaramıyor:

Her modül için bağımsız olarak bir IDEA .iml dosyası oluşturmak için sbt-idea kullanın ; daha sonra sıfırdan bir ana IDEA projesi oluşturun ve bu modülleri ona ekleyin. Bu, modül kaynaklarının tümünü aynı pencerede düzenlenebilir hale getirir, ancak aralarındaki bağımlılıklar izlenmez (bu nedenle, foo projesindeki bazı kaynaklardan çubuktaki bir şeye gitmeye çalışmak , beni yerel kaynaklara değil, çubuğun içe aktarılan kitaplık sürümüne götürür. ).

Ana projenin Build.scala'sının aşağıdaki gibi şeyleri içerdiği sbt çoklu proje yapılarını (alt projeler olarak da bilinir) kullanın :

lazy val foo = Project(id = "foo", base = file("foo"))
lazy val bar = Project(id = "bar", base = file("bar")) dependsOn(foo)

Bu neredeyse işe yarıyor, çünkü sbt fikri, takip edilen alt projeler arasındaki bağımlılıkları olan bir ana IDEA projesi oluşturuyor. Ancak iki uyarı var:

  1. Alt projelerin ana projenin alt dizinlerinde yaşaması gerektiği bir sbt kısıtlaması gibi görünüyor (yani, file("../foo")izin verilmiyor). Bu gerçekten istediğim şey değil (ya bir modül - "utils" veya "commons" paketi gibi - iki farklı ana projede kullanılıyorsa?) Ama ben onunla yaşayabilirim.
  2. Alt projelerimden birinin kendi alt projeleri var; Sbt'nin kendisinin bu iç içe geçmiş projelerle doğru bir şekilde ilgilenip ilgilenmediğinden emin değilim, ancak her durumda sbt-idea tarafından yok sayılır. Açıkçası, ana projeye özyinelemeli olarak dahil edilecek iç içe geçmiş alt projelere ihtiyacım var.

Özetlemek gerekirse: Halihazırda alt projeleri olabilecek modülleri , uygun düzenleme için izlenen bağımlılıkları olan tek bir büyük IDEA projesinde toplamak istiyorum . Nasıl yapabilirim? Teşekkürler!


2
Diğerlerine harici proje referansları olarak bağlanan bir meta proje oluşturmayı deneyin ( github.com/harrah/xsbt/wiki/Full-Configuration ). Bunu kendi başıma sbt-idea ile denemedim, bu yüzden bu bir cevaptan çok bir yorum.
retronym

Fikir için teşekkürler - ama ne yazık ki sbt-idea dış referansları tamamen görmezden geliyor.
David Soergel

Belki de bu sbt-fikrinin sonraki sürümde yardımcı olacaktır: github.com/mpeltonen/sbt-idea/commit/9f17cc8 github.com/mpeltonen/sbt-idea/commit/4b4adf75
retronym

Harika, bu yüzden bu değişiklikleri almak için en son git kaynaklarından svn-idea kurdum, sonra projeleri temizledim ve tekrar sbt-idea çalıştırdım. Tam olarak anlamadığım bazı garip bağımlılık çözme sorunları vardı, ama bir şekilde sonuçta çalışan bir projeyle sonuçlandım! Alt alt projeler için IDEA'daki kaynak dizinleri manuel olarak ayarlamak zorunda kaldım; ve geçmişe baktığımda, bunu ilk başta hisse senedi sbt-idea 11.1 ile yapamayacağımdan emin değilim. Her neyse, teşekkürler-- Şimdilik bu yakı tıraş etmeyi bırakabilirim.
David Soergel

Son yorumu yazdıktan sonra, sonuçta çalışan bir projem olmadığını anladım (yine, alt-alt projeler ile ilgili sorun). Bu yüzden bunları birinci sınıf projelere ayırdım, bu yüzden ana projemin altında sadece bir seviye alt proje var. Tabii ki bunu sadece başlangıçta kendi kodum olduğu için yapabildim.
David Soergel

Yanıtlar:


7

Çoklu proje oluşturma yaklaşımı doğru olanıdır. Rasgele uzunluktaki alt projelerin iç içe geçmiş bir ağacınız olabilir, ancak birden çok üst projeye ait bir modülünüz olamaz. Bu kesinlikle mantıklı ve Maven'de de aynı şey oluyor.

Bunun nedeni, aynı modülü birden fazla projede bulundurmanın ve kaynakları senkronize etmenin zor olmasıdır. Normal bir iş akışı şu şekildedir:

  • Modül kaynağını değiştirdiğiniz, modülün ait olduğu bir projeniz var.
  • Modülü yerel deponuzda yayınlarsınız
  • Modüle ihtiyaç duyduğunuz diğer projelerde, onu bir kütüphane olarak beyan edersiniz.

Idea içindeki mevcut projeye ait olmayan bir modül yüklemek istiyorsanız, bu, ancak bunu çalışma alanına harici bir modül olarak ekleyebileceğiniz için uygulanabilir:

  • SBT-IDEA, projeniz için .iml dosyalarını oluşturur ve bunları çalışma alanına aktarırsınız
  • Diğer projelerin other.iml'sini çalışma alanına ekleyebilirsiniz.
  • Çalışma alanına manuel olarak eklediğiniz harici SBT modüllerini değiştirirseniz, değişiklikleri "ana" projede görünür hale getirmek için bunları yeniden yayınlamalısınız, bu harici modülleri "libraryDependency" olarak görür.

Giriş için teşekkürler. Ancak sorun şu ki, "Rasgele uzunluktaki alt projelerin iç içe geçmiş bir ağacına sahip olabilirsiniz" durumu değil. Bunun sbt ile çalışması gerektiğini kabul ediyorum, ancak sbt-idea sonuçta ortaya çıkan IDEA proje dosyasında alt-alt projeleri içermiyor.
David Soergel

Bu sınırlama fikirden mi kaynaklanıyor?
Edmondo1984

Hayır, kesinlikle IDEA proje hiyerarşilerini birkaç seviye derinliğinde oluşturdum.
David Soergel

7

Alt projelerin ana projenin alt dizinlerinde yaşaması gerektiği bir sbt kısıtlaması gibi görünüyor (yani, dosyaya ("../ foo") izin verilmez). Bu gerçekten istediğim şey değil (ya bir modül - "utils" veya "commons" paketi gibi - iki farklı ana projede kullanılıyorsa?) Ama ben onunla yaşayabilirim.

Sbt 13.5 ve intellij 13.x ile, bir Build.scala kullanarak göreceli yolla projeler arası bağımlılığı belirtebilirsiniz . Diyelim ki her ikisi de ortak bir dizin kodunda yaşayan iki projeniz var, bir çekirdek proje ortak ve başka bir proje foo

  1. kod / foo / project / altında Build.scala oluşturun
  2. Bu kod parçacığını insde Build.scala koy

    object ProjectDependencies {
        val commons = RootProject(file("../commons"))
    }
    
    object ProjectBuild extends Build {
        import ProjectDependencies._
    
        lazy val root = Project(id = "foo", base = file(".")).dependsOn(commons)
    }
    
  3. IntelliJ projenizi sbt aracılığıyla oluşturun sbt gen-idea


bu "ortak" kaynağının "foo" dan bağlantı oluşturarak düzenlenmesine izin verecek mi?
Tjunkie

Evet izin verir. Ve sbt 0.13.7 ve intellij 14.0.3 kurulumumda çalışıyor
user2829759
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.