【问题标题】:How do I reference play framework third party modules without referencing an absolute path?如何在不引用绝对路径的情况下引用播放框架第三方模块?
【发布时间】:2011-11-09 02:34:46
【问题描述】:

这是我的情况。我有一个使用guice module 的播放应用程序。为了使用 guice 模块:

  • 我使用play install guice 安装了它。这会将其安装在$PLAY_HOME/modules 中,这对我来说很好。我不想以任何方式编辑模块文件。
  • 然后我在dependencies.yml 中声明了该模块,如下所示:- play -> guice 1.2
  • 在我的应用程序中,我运行了 play dependencies,这很好地解析了模块并创建了一个引用 guice 模块的 modules/guice-1.2 文件。

问题在于该文件的内容类似于以下内容:/some-absolute-path/play-1.2.x/modules/guice-1.2

在本地工作进行开发时效果很好。但是当我想移动到生产服务器时,安装不同的 Play! (即使用不同的绝对路径)它会显然失败。

那么处理这个问题的最佳方法是什么?

现在我已经诉诸于在application.conf 文件中声明模块,如下所示:module.guice=${play.path}/modules/guice-1.2。 不幸的是,${play.path} 魔法似乎不适用于那些生成的文件。

顺便说一句,我使用的是 1.2.3 版的 Play!

【问题讨论】:

    标签: module dependencies playframework


    【解决方案1】:

    当您在生产环境中运行时,您可以将依赖项(通过 play deps 命令)与本地安装的 Play 重新同步,或者在某些情况下,您可以预编译所有内容,然后路径就不会出现问题。

    例如,第二种情况是 Heroku 的情况。

    【讨论】:

    • 这听起来不太理想。看起来就像 Play 中的一切!这样一来,一旦提交文件就不必更改任何内容,只需在生产中使用pay start。在生产环境中重新运行 play dependencies 似乎适得其反,尤其是在这种情况下它会更改 source 代码(即module/guice-1.2)文件。我不完全确定 precompile everything 场景是什么意思。如果我将我的 application.mode 设置为 prod 然后播放!进行编译。不过,这并没有改变我的问题……
    • @SaM 好吧,在绝对路径上,避免它的唯一方法是在 dev 和 prod 中具有相同的路径,如果你必须重新运行 deps 命令以避免问题。在预编译时,我只是提到了它,因为尝试 heroku 我看到它确实这样做了(也许它正在将代码打包到战争中?现在无法检查)并且我对依赖项没有任何问题。所以这可能是答案。
    【解决方案2】:

    你应该尝试在你的 dependencies.yml 文件中使用 ${application.path},就像这个例子中一样

    require:
        - play -> crud
        - provided -> DateHelper 1.0 
    repositories: 
        - provided: 
            type:       local 
            artifact:   "${application.path}/jar/[module]-[revision].jar" 
            contains: 
                - provided -> * 
    

    看到这个问题:How can I specify a local jar file as a dependency in Play! Framework 1.x

    【讨论】:

    • 这不是我想要达到的目标。我安装的模块安装在PLAY_HOME/modules 中,我打算从那里使用,因为这是 play 安装它的地方。 dependencies.yml 文件还创建了对它的本地引用并且不复制它,因此它不应该被复制,这让我感到安慰。我只是希望该引用不是绝对路径,而是PLAY_HOME/modules 目录中模块的相对(或参数化)路径。有意义吗?
    【解决方案3】:

    这不是你的问题的答案,但我遇到了同样的问题。

    • 我不想在生产中调用重新同步依赖项。
    • 我不想问我的团队成员,安装特殊模块。
    • 我不想提交包含带有模块位置的绝对路径的文件。

    我发现的唯一解决方法是:不要在 Play 中安装模块!应用程序,只需包含手动使用此模块的 jars。 play-guice.jar 应该包含在 @opensas 建议中,aopalliancecom.google.inject 作为常规依赖项包含在 dependencies.yml 中。

    有趣的是,重新同步依赖项也会删除 .svn 文件,所以在调用此命令之前备份它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2012-12-15
      • 2020-05-20
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多