Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure profiles.clj中提供的是什么意思?_Clojure_Leiningen_Luminus_Environ - Fatal编程技术网

Clojure 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

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的文档中,它似乎指出有两个条目,一个用于开发,一个用于测试

:提供的
配置文件用于指定在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]