什么:在profiles.clj中提供了什么意思?

时间:2015-07-17 08:26:38

标签: clojure leiningen luminus environ

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"}}}

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

3 个答案:

答案 0 :(得分:7)

TL; DR 提供个人资料用于 profiles.clj ,作为 dev 的替代方案个人资料,因为如果使用 dev 将覆盖 project.clj 中指定的整个 dev 个人资料。< / p>

:provided最常见的用途是指定在jar创建期间应该可用的依赖项,但是将由运行时环境提供。但我认为这里用来阻止 profiles.clj 中配置的:env(不打算提交到源代码存储库中)来覆盖{{1}在 project.clj 中配置。

Luminus会在 profiles.clj 中使用:env个人资料而不是:dev,如果不是因为他们已经把东西放在{{{ 1}} project.clj :provided个人资料中的条目,将被 profiles.clj 中的内容覆盖。

this example repo。如果您立即运行它,而不进行任何更改( profiles.clj 中的:env),输出将为:

:dev

如果您在 profiles.clj 中将:provided更改为› lein run Hello, world Db config: some:db://localhost ,则输出将更改为:

:provided

他们没有合并,但 profiles.clj 中的:dev覆盖了 profile.clj 中的› lein run Hello, nil Db config: some:db://localhost

编辑:我刚刚发现,如果 profiles.clj 中使用:env,则不仅会覆盖:env条目。整个:env个人资料将被覆盖。这在profiles documentation

中有解释
  

请记住,如果多个指定了具有相同名称的配置文件   位置,只选择具有最高“优先级”的配置文件 - 否   合并完成。 “优先级”是 - 从最高到最低 -   profiles.clj,project.clj,用户范围的配置文件,最后是系统范围的   轮廓。

因此,在 profiles.clj 中使用:dev围绕leiningen个人资料的合并策略进行了一些 hack

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

答案 1 :(得分:3)

  

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

- Reference

答案 2 :(得分:0)

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

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

这是BouncyCastle的情况。

因此,您的provided可能如下:

project.clj

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

因此原始jar文件 as-is 必须存在于类路径中:

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