Play 2.0 和 SNAPSHOT 依赖项

Posted

技术标签:

【中文标题】Play 2.0 和 SNAPSHOT 依赖项【英文标题】:Play 2.0 and SNAPSHOT dependencies 【发布时间】:2012-07-23 12:48:06 【问题描述】:

我正在混合构建环境中设置我的第一个游戏应用程序。我的公司(到目前为止)对所有事情都使用 maven,我正试图让我的 play 应用程序与我的其他工件很好地交互。

有什么方法可以让 ivy/sbt/play 以类似于 maven 的方式处理 SNAPSHOT - 即始终从远程存储库更新它们(例如,在构建工作人员上)或使用本地 .m2存储库直到依赖“过期”,然后从服务器刷新它。

我已经在我的 Build.scala 中为一个工件声明了一个 SNAPSHOT 依赖项,我希望这个依赖项的本地更新对我的 play 项目可见。在 Maven 方面,我执行以下操作

mvn clean install

它(当然)构建并将我的外部工件安装到我的本地 maven 存储库(位于 ~/.m2/repository)。我希望这些更改对我的 play 项目立即可见,但我不知道如何告诉 sbt/play 不要缓存 SNAPSHOT。不管我做什么,这个依赖永远不会在播放中刷新——我必须进入实际的播放常春藤缓存并手动删除依赖以获取任何更改。理想情况下,我希望 sbt/ivy 只解析到我的本地 maven repo 的路径,而不是在内部缓存它。我的 Build.scala 中有以下内容

val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
    resolvers += "Local Maven Repository" at "file://" + Path.userHome.absolutePath + "/.m2/repository",
    testOptions in Test := Nil
)

当我在 play 中运行构建时,它会正确使用此 repo,但随后会将结果缓存在 ivy 缓存中。有没有我可以告诉 Ivy/sbt 不要这样做的咒语?也许在 ivysettings.xml 中有一些东西?

【问题讨论】:

***.com/questions/8224907/… 有帮助吗? 是的 - 我已经尝试了所有我能想到的组合。 vanilla play 2.0 安装缓存 SNAPSHOTS,您必须手动删除它们。使用 sbt 0.11(未安装 play)也是如此。此外,将 sbt 0.12 与最新的 Play 2.1 SNAPSHOT 一起使用也展示了这一点。无论我做什么,SNAPSHOT 都缓存在 ~/.ivy2/cache 中,任何 sbt/play 咒语都不会导致 sbt/play 更新 ivy 缓存中的这个 SNAPSHOT。 【参考方案1】:

@kheraud -> clean /reload/ update -> 将不起作用 sbt 将其缓存在本地,并且不再检查本地 maven 中的新快照

@dprat -> 我一直在网上寻找解决方案,但没有找到更多:( 我放弃了-只需删除常春藤缓存中的本地包并执行play update 你可以简化它并制作一个脚本

rm -rf ~/.ivy2/cache/your.package.foo
play update compile

【讨论】:

【参考方案2】:

我在其他地方看到这归因于 SBT 缺陷https://groups.google.com/forum/?fromgroups=#!topic/play-framework/O7_cAdUWQII

一种解决方案似乎是使用 Nexus。您必须从 maven 部署到 nexus。您将不得不使用 nexus 路径而不是 mvn。您必须安装并运行 nexus!

要安装 nexus,请转到 sonatype 并下载。观看文件权限(阅读说明),但这很简单。您需要将凭据放在 ~/.m2/settings.xml 中。默认为 admin,admin123。

<settings>
  <servers>
    <server>
      <id>snapshots</id>
      <username>admin</username>
        <password>admin123</password>
    </server>
  </servers>
</settings>

maven deploy 由 nexus 提供给你,例如:

<distributionManagement>
    <repository>
        <id>releases</id>
        <url>http://0.0.0.0:8081/nexus/content/repositories/releases</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://0.0.0.0:8081/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
</distributionManagement>

然后mvn deploy 会将你的资源放在那里。

然后在play sbt中使用

resolvers += "Local Nexus Repository" at "http://0.0.0.0:8081/nexus/content/repositories/snapshots"

您仍然需要停止播放,使用播放更新,然后重新开始播放。

【讨论】:

【参考方案3】:

你可以使用:

play reload // 重新加载当前应用构建文件 play update // 更新应用依赖

在构建您的应用程序之前。我不知道您是否可以将 sbt 配置为不缓存 SNAPSHOT 依赖项,但是您可以编写构建过程以强制重新加载依赖项。

【讨论】:

【参考方案4】:

我不确定这是如何工作的,但是“另一个人告诉我”——是的,这就是我对此的参考范围——清理 play 安装中的“存储库”文件夹可能会有所帮助。

我有一个小“refresh.sh”脚本可以做到这一点:

rm -rf /opt/play/repository/cache/com.mycompany
play clean
play update
play run

这似乎对我有用。 “/opt/play”是您安装 play 的位置,“com.mycompany”是您需要刷新的位置。

我并不是说这是对的,但如果没有其他方法,它可能值得一试。

【讨论】:

【参考方案5】:

从 sbt 版本 0.13.6(2014 年 8 月)开始,可以使用 Build.scala/build.sbt 中的构建设置标志 updateOptions 来控制 SNAPSHOT 分辨率。

updateOptions := updateOptions.value.withLatestSnapshots(false/true)

有关此新功能的文档是here

在github上对应pull request了解详情。

【讨论】:

以上是关于Play 2.0 和 SNAPSHOT 依赖项的主要内容,如果未能解决你的问题,请参考以下文章

使用 SBT 和 SNAPSHOT 依赖项脱机工作

列出 SNAPSHOT 依赖项

ivy(2.3.0 或 2.4)不使用分类器解析 SNAPSHOT maven 依赖项

理解Maven中的SNAPSHOT版本和正式版本

Maven中的SNAPSHOT版本和正式版本理解

理解Maven中的SNAPSHOT版本和正式版本