2014-05-06 18 views
14

Tôi có một thư viện sử dụng plugin thiên đường macro (được gọi là thư viện nhà cung cấp macro). Trong build.sbt,Trình biên dịch SBT Plugin như phụ thuộc Transitive

addCompilerPlugin("org.scalamacros" % "paradise" % "2.0.0" cross CrossVersion.full) 

để đạt được quyền truy cập vào các chú thích vĩ mô.

Khi thêm thư viện macro dưới dạng libraryDependency vào một dự án riêng biệt (được gọi là dự án tiêu dùng macro), chú thích có mặt, nhưng việc triển khai macro không bao giờ được gọi. Thêm plugin trình biên dịch thiên đường macro vào dự án tiêu dùng macro libraryDependencies giải quyết vấn đề.

Có thể bao gồm các plugin trình biên dịch dưới dạng phụ thuộc transitive không? Điều này sẽ miễn phí người tiêu dùng của thư viện macro từ việc thêm các plugin cần thiết.


Update # 1:

Các addCompilerPlugin helper thêm phụ thuộc vào libraryDependencies và thiết lập sự phụ thuộc với một configuration = Some("plugin->default(compile)") trong thư viện vĩ mô cung cấp dịch vụ.

Thêm phụ thuộc vào paradise phụ thuộc vào libraryDependencies của thư viện nhà cung cấp macro làm cho tạo phẩm hiển thị trong dự án người tiêu dùng vĩ mô. Nó không thêm phụ thuộc như là một trình biên dịch plugin.

Cập nhật # 2:

Thiết autoCompilerPlugins := true trong dự án vĩ mô tiêu dùng kết hợp với Update # 1 không giải quyết được vấn đề này.

Trả lời

1

Cách duy nhất tôi tìm thấy để giải quyết vấn đề này là thêm một mô-đun phụ sbt-plugin bao gồm các cài đặt được yêu cầu. Plugin là rất cơ bản,

package fixme 

import sbt._ 
import Keys._ 

object Plugin extends sbt.Plugin { 
    val paradiseVersion = "2.0.0" 
    val fixmeVersion = "1.4" 
    val fixmeSettings: Seq[Setting[_]] = Seq(
    resolvers += "tysonjh releases" at "http://tysonjh.github.io/releases/", 
    libraryDependencies <++= (scalaVersion) { v: String ⇒ 
     (if (v.startsWith("2.10")) List("org.scalamacros" %% "quasiquotes" % paradiseVersion % "compile") 
     else Nil) :+ 
     "org.scala-lang" % "scala-reflect" % v % "compile" :+ 
     "com.tysonjh" %% "fixme" % fixmeVersion % "compile" 
    }, 
    addCompilerPlugin("org.scalamacros" % "paradise" % paradiseVersion cross CrossVersion.full)) 
} 

Điều này có thể được sử dụng bằng cách bao gồm trong project/plugins.sbt của bạn,

resolvers += "tysonjh releases" at "http://tysonjh.github.io/releases/" 

addSbtPlugin("com.tysonjh" % "sbt-fixme" % "1.4") 

build.sbt tập tin,

fixmeSettings 

Các thiết lập SBT-plugin thêm macro plugin thiên đường như một sự phụ thuộc trình biên dịch và việc triển khai macro như là một sự phụ thuộc thư viện.

Các vấn đề liên quan