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。
答案 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这样的框架,它们提供自己的某些库的副本。
答案 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"]]}}