Clojure profiles.clj中提供的是什么意思?
Luminus现在正在使用以下内容创建profiles.clj:Clojure profiles.clj中提供的是什么意思?,clojure,leiningen,luminus,environ,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&p
{: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的文档中,它似乎指出有两个条目,一个用于开发,一个用于测试
:提供的
配置文件用于指定在jar创建期间应该可用的依赖项,但不会传播到依赖于您的项目的其他代码。这些是项目假设的依赖项,将由jar使用的任何环境提供,但在项目开发过程中需要这些依赖项。这通常用于Hadoop之类的框架,它们提供自己的某些库的副本
--TL;DR:profiles.clj中使用提供的配置文件作为开发配置文件的替代,因为如果在那里使用开发,它将覆盖project.clj中指定的整个开发配置文件
:provided
最常用的用法是指定在jar创建过程中应该可用的依赖项,但这些依赖项将由运行时环境提供。但我认为这里是用来防止profiles.clj中配置的:env
(不打算提交到源代码存储库)覆盖project.clj中配置的:env
Luminus会使用profiles.clj中提供的:dev
配置文件而不是:profiles.clj中提供的:dev
配置文件,如果不是因为他们已经在profile.clj中的:env
条目中添加了内容,那么project.clj中的:dev
配置文件将被profiles.clj中的内容覆盖
看。如果立即运行它,没有任何更改(profiles.clj中提供了),输出将为:
› lein run
Hello, world
Db config: some:db://localhost
如果将profiles.clj中的:provided
更改为:dev
,则输出将更改为:
› lein run
Hello, nil
Db config: some:db://localhost
它们没有合并,但是profiles.clj中的:env
重写了profile.clj中的:env
编辑:我刚刚发现,如果profiles.clj中使用了:dev
,则不仅会覆盖:env
条目。整个:dev
配置文件将被覆盖。下文对此进行了解释:
请记住,如果在多个配置文件中指定了具有相同名称的配置文件
位置,仅拾取具有最高“优先级”的配置文件–否
合并完成。“优先级”从最高到最低:
profiles.clj、project.clj、用户范围的概要文件,最后是系统范围的概要文件
简介
因此,在profiles.clj中使用:提供的
,是对leiningen profiles合并策略的一个小技巧
它至少有一个缺点:如果您需要在project.clj中定义一个:provided
概要文件来指定在运行时环境中可用的依赖项,它将被profiles.clj中定义的依赖项覆盖。正如@nberger所说的provided
用于指定在您的应用程序中应该可用的依赖项类路径,但将由运行时提供
一种特殊的情况是,如果在项目中包含库,那么在创建uberjar时,它们的签名就会被弄乱
中国的情况就是这样
因此,您的项目.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
:此处提供的
不用于依赖项,而是为了防止profiles.clj中配置的:env
覆盖project.clj中配置的:env
,并将它们合并到一起。标题包含特定于概要文件的项目属性的映射。在:dependencies
处指定一个值是一个常见的用例,可以添加jar
特定的依赖项。但也可以包含其他密钥。当然可以。但这里的微妙之处在于,luminus本应在profiles.clj中使用:dev
配置文件,但却使用:provided
。例如,如果您使用mysql创建一个新的luminus项目,您将在project.clj中获得{:dev:env{:dev true:nrepl port 7001}
,并且{:provided{:env{:database url“jdbc:mysql://localhost:3306/trylum_dev?user=db_user_name_here&password=db_user_password_here“}}
在profiles.clj中。奇怪的是为什么profiles.clj中没有使用:dev
,我想我的答案解决了这个问题。@nberger很有趣。谢谢,谢谢你的详细回答!在Luminus中,我们最终使用了一种不同的hack,因此可以很容易地在project.clj和profiles.clj.Cool中修改dev和test的hashmap!是的,为了实现profiles.clj中可配置的envs的lein environ的承诺,您最终进行了不同的破解。我最终完全没有使用leinenviron(但继续使用environ)。environ的自述文件建议在profiles.clj中使用:dev和:test,但不解释它会覆盖project.clj中的相同概要文件。有人应该编辑自述文件来解释这个小细节:)顺便说一句,在环境中已经有一个关于这个的问题,有一些有用的信息:。我最喜欢的解决方案是将dev概要文件重新定义为:dev[:project/dev:profiles/dev]