【问题标题】:How to separate development and production keys in Leiningen app on heroku?如何在 Heroku 上的 Leiningen 应用程序中分离开发和生产密钥?
【发布时间】:2020-03-15 18:17:06
【问题描述】:

我想要两组不同的 API 密钥用于开发和生产,我想根据应用是在本地运行还是在 heroku 上运行来自动使用它们。

对于 nodejs 应用程序,我执行以下操作:

if (process.env.NODE_ENV === 'production') {
// ./prod contains the production keys
module.exports = require('./prod');
} else {
// ./dev contains the development keys
module.exports = require('./dev');
}

如何在 Clojure Leiningen 应用程序中执行类似操作? process.env.NODE_ENV 类比是什么,如何实现?

【问题讨论】:

    标签: heroku clojure leiningen


    【解决方案1】:

    Clojure 在 JVM 上运行,因此您可以使用 java System 类。假设您在 bash 中设置了 APP_ENVIRONMENT 变量。

    (if (= "production"
           (or (System/getenv "APP_ENVIRONMENT")
               "development"))
      (start/production)
      (start/development))
    

    【讨论】:

      【解决方案2】:

      我想说最干净的解决方案是将environ 库与lein-environ 插件一起使用。

      通过这些,您可以将 API 密钥的开发版本存储在 leiningen 开发配置文件中的 env var 中,并在生产环境中将它们作为实际环境变量传递。例如。您可以在project.clj 中包含以下内容:

      (defproject ...
      ...
      :profiles {:dev {:env {:my-api-key "whatever-dev" } } }
      ...)
      

      在生产环境中,您可以简单地将环境变量 MY_API_KEY 设置为“whatever-prod”。

      在您的代码中,您将像这样访问密钥:

      (require '[environ.core :refer [env]])
      (env :my-api-key) ;; would yield "whatever-dev" on dev and "whatever-prod" on prod environment
      

      特别是,这允许您不将生产密钥存储在源代码控制之下。

      environ 提供了更多选项 - 特别是 env 文件,它也可能满足您的需求。请检查它的功能。

      如果您还需要访问 CLJS 中的环境变量(在前端),您确实不能简单地访问那里的环境变量(因为不再有环境之类的东西 - 代码在客户端上运行)。

      不过,如果您只想在编译期间将值放入生成的 js 中,您可以使用 environ + 宏。您将在 clj 文件中编写一个仅返回 env var 的宏,然后在您的 cljs 文件中引用它。在编译期间,将注入适当的值。

      在 clj 文件中:

      (ns yourns.environment
        (:require [environ.core :refer [env]]))
      
      (defmacro my-api-key []
        (env :my-api-key))
      

      在 cljs 中:

      (ns yourns.core
       (:require-macros [yourns.environment :refer [my-api-key]))
      
      (my-api-key) ;; will return the appropriate value
      

      但请注意,变量值将在编译时注入,以后无法更改。

      完整的代码示例请参见here

      【讨论】:

      • 在 cljs 文件中使用它不起作用。我收到错误消息:无法在 1.907 秒内从 ["src/cljs" "src/cljc" "dev"] 编译 build :app。 ---- 无法分析 src/cljs/myapp/events.cljs ---- 没有这样的命名空间:environ.core,找不到 environ/core.cljs、environ/core.cljc 或提供“environ. core" ---- 分析错误:请参阅 src/cljs/myapp/events.cljs ---- Figwheel:为路径启动 CSS Watcher ["resources/public/css"] 在 localhost:5000 上启动 myapp ---- -- 如何在cljs文件中分离prod和dev环境?
      • @zengod 有一种稍微复杂的方法可以将其扩展到 js - 请再次检查答案,我已更新。
      • 我有两个需要环境变量的 cljs 文件。我以完全相同的方式要求两个文件中的宏(:require-macros ...)。它在 events.cljs(使用重新框架)文件中工作,但在 views.cljs 文件中显示“未声明的变量”。为什么会这样,如何解决?
      • @zengod 听起来很奇怪。你能发现文件之间的任何差异吗?他们住在你项目的同一个地方吗?他们属于同一个项目吗?您是否以完全相同的方式在它们中调用所需的宏?
      • 只有当我需要两个这样的宏时才会发生这种情况: (:require-macros [cljs.core.async.macros :refer [go]] [vendo.environment :refer [vendo-url]] ) 但是当我只有一个时有效。那么如何需要两个宏呢?
      猜你喜欢
      • 2023-02-08
      • 2016-05-06
      • 2023-03-18
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多