10

Luminus 现在正在使用以下内容创建一个profiles.clj:

{:provided {:env {;;when set the application start the nREPL server on load
                  :nrepl-port "7001"
                  :database-url "jdbc:mysql://localhost:3306/mysqlkorma_dev?user=db_user_name_here&password=db_user_password_here"}}}

:provided 在这里做什么?在 environ 的文档中,它似乎指向有两个条目,一个用于开发,一个用于测试https://github.com/weavejester/environ

4

3 回答 3

9

TL;DR:所提供的配置文件在profiles.clj中用作dev配置文件的替代品,因为如果在那里使用dev,它将覆盖project.clj中指定的整个dev配置文件


最常见的用途:provided是指定在 jar 创建期间应该可用的依赖项,但将由运行时环境提供。但我认为这里被用作防止配置:env文件中配置的一种方式:env

Luminus 会使用:dev配置文件而不是:providedprofiles.clj中,如果不是因为他们已经在project.clj的配置文件中:env条目中放入了东西,这将被 profile.clj 中的内容覆盖。:dev

请参阅此示例回购。如果您立即运行它,而不进行任何更改(:providedprofiles.clj中),输出将是:

› lein run
Hello, world
Db config: some:db://localhost

如果您更改:provided:devprofiles.clj中,则输出更改为:

› lein run
Hello, nil
Db config: some:db://localhost

他们没有被合并,但是:envin profiles.clj覆盖了:envin profile.clj


编辑:我刚刚发现,如果在profiles.clj中使用,不仅:env条目会被覆盖。整个配置文件将被覆盖。这在配置文件文档中进行了解释::dev:dev

请记住,如果在多个位置指定了具有相同名称的配置文件,则仅选择具有最高“优先级”的配置文件 - 不进行合并。“优先级”是——从最高到最低——profiles.clj、project.clj、用户范围的配置文件,最后是系统范围的配置文件。

因此,:providedprofiles.clj中使用是围绕leiningen 配置文件的合并策略的一个小技巧。

它至少有一个缺点:如果您需要在project.clj:provided中定义一个配置文件以指定将在运行时环境中可用的依赖项,它将被配置文件.clj 中定义的配置文件覆盖。

于 2015-07-17T13:35:44.870 回答
3

:provided配置文件用于指定在 jar 创建期间应该可用的依赖项,但不会传播到依赖于您的项目的其他代码。这些是项目假定将由使用 jar 的任何环境提供的依赖项,但在项目开发期间需要这些依赖项。这通常用于像 Hadoop 这样的框架,它们提供自己的某些库的副本。

--参考

于 2015-07-17T13:28:57.560 回答
1

正如@nberger 所说provided,用于指定类路径中应该可用的依赖项,但将由运行时提供。

一种特殊情况是库,如果包含在您的项目中,则在创建 uberjar 时会弄乱它们的签名。

这就是BouncyCastle的情况。

所以你project.clj可能看起来像:

:profiles {:dev {:dependencies [[org.bouncycastle/bcprov-jdk15on "1.50"]]}
           :provided {:dependencies [[org.bouncycastle/bcprov-jdk15on "1.50"]]}}

在这种情况下,您说对于开发,您可以使用 maven 存储库中的库,但在运行时它必须由环境提供。

所以原始 jar 文件原样,必须存在于类路径中:

java -cp bcprov-jdk15on-151.jar:your-standalone.jar clojure.main
于 2015-07-19T01:31:52.657 回答