V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
FaiChou
V2EX  ›  程序员

.env 应不应该放到 git 中?

  •  
  •   FaiChou ·
    FaiChou · 2020-04-10 15:27:23 +08:00 · 8455 次点击
    这是一个创建于 1692 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Gatsby.js Link

    Please note that you shouldn’t commit .env.* files to your source control and rather use options given by your Continuous Deployment (CD) provider.

    在 Gatsby.js 文档中提到, .env.* 不应该提交到 git 中,但是 .env.* 里的变量不都是给项目用的吗?最终编译后可以在代码中找到对应的值,所以对用户而言,这些变量都是 public 的。

    所以我觉得 .env.* 可以放到 git 中,即使是一个开源项目。

    第 1 条附言  ·  2020-04-10 16:00:05 +08:00
    讨论前端下的 .env.*
    55 条回复    2020-05-12 08:27:14 +08:00
    R18
        1
    R18  
       2020-04-10 15:32:44 +08:00
    .env 是一个配置文件,里面可能会有用户的私人配置,密钥之类的东西。通俗做法是 写一个 env 文件来进行通用配置,用户 copy 后自由发挥
    Vegetable
        2
    Vegetable  
       2020-04-10 15:33:12 +08:00
    说两个我想到的点

    我曾经因为一个 react-native 项目的.env 文件包含了别人的 JavaHome 还是 AndroidHome 变量,耽误了不少时间.
    有一些密码会通过环境变量保存, 上传到仓库并不安全
    FaiChou
        3
    FaiChou  
    OP
       2020-04-10 15:40:17 +08:00
    @Vegetable #2 「有一些密码会通过环境变量保存, 上传到仓库并不安全」.env 本身就不应该放密码等信息,所以两码事。
    FaiChou
        4
    FaiChou  
    OP
       2020-04-10 15:41:28 +08:00
    @Vegetable #2 我明白你的意思了,有些小白用户会错误的将密码放到 .env 来管理,所以还是建议大家 .env 不要托管到 git 中。是吧
    tabris17
        5
    tabris17  
       2020-04-10 15:42:14 +08:00
    你想和大家分享你的密码?
    jarontai
        6
    jarontai  
       2020-04-10 15:44:45 +08:00 via iPhone   ❤️ 3
    .env 文件本身肯定不入 git 啊,入 git 的应该是一个模版比如:.env.example,其中添加配置示例和注释,给用户拷贝然后进行配置
    FaiChou
        7
    FaiChou  
    OP
       2020-04-10 15:46:11 +08:00
    @tabris17 #5 有什么密码需要放到 .env 中?放到 .env 中就代表你要用这个变量,最终 webpack 打包工具会将 .env 中的值赋给项目代码引用的地方,对前端来说,代码是 public 的,任何人都可以看到「密码」。
    int64ago
        8
    int64ago  
       2020-04-10 15:46:53 +08:00   ❤️ 1
    int64ago
        9
    int64ago  
       2020-04-10 15:47:29 +08:00
    不要说我什么不打码……这些人既然公开了这些就不值得同情
    koolob
        10
    koolob  
       2020-04-10 15:48:21 +08:00
    实际用到的.env 不要传,可以传的是.env 文件的模版。
    另外可以加一个脚本,通过参数来生成.env 文件。

    其实这是 git 上到底应该放什么不放什么的问题。
    我觉得凡是跟运行环境有关的个性化的东西,就都不要传 git 。比如本地目录路径、本地测试用的账号密码什么的。
    Raincal
        11
    Raincal  
       2020-04-10 15:48:36 +08:00 via Android
    有些变量只在构建阶段会用到,并不能在构建后的代码中看到
    skys215
        12
    skys215  
       2020-04-10 15:50:56 +08:00
    知道为什么叫.env 吗? env 就是 environment 的缩写,就是说,这个文件里的值是只针对当前环境的,因此.env 不应该跟着传上去。如果想统一管理配置,那有对应的软件可以支持。好像叫 zookeeper 什么的。
    b821025551b
        13
    b821025551b  
       2020-04-10 15:50:56 +08:00   ❤️ 1
    你的眼光不应该只局限于前端范围,后端也同样要用到.env 之类的,里面是放了各种服务的 key
    FaiChou
        14
    FaiChou  
    OP
       2020-04-10 15:53:12 +08:00
    @int64ago #8 我觉得这位用户的项目开源出来就是个错误。。发现刚刚开源的 ~ 正如 4L 提到的,小白用户错误的将 .env 中贴了密码等信息。即使不放 .env 中,程序中也能找到,再不济抓个包也能看到吧。
    ngrok111
        15
    ngrok111  
       2020-04-10 15:53:14 +08:00
    影响不大的可以写入
    env_example
    FaiChou
        16
    FaiChou  
    OP
       2020-04-10 15:54:33 +08:00
    @b821025551b #13 哦哦,谢谢提醒,我没有接触过后端。我 append 下前提概要。
    iyear
        17
    iyear  
       2020-04-10 15:57:04 +08:00
    gitignore 加*.env ,自己的配置就用这个后缀
    再新建一个配置模板文件.env.example
    README 让用户下载模板自己改
    tabris17
        18
    tabris17  
       2020-04-10 16:01:41 +08:00
    @FaiChou 很难跟前端解释这个问题
    dtsdao
        19
    dtsdao  
       2020-04-10 16:04:40 +08:00
    前端的 .env 可以放后端地址啊,你不可能直接拿生产服务器测试吧?这个东西配置的时候在开发文档里说明一下就是了
    FaiChou
        20
    FaiChou  
    OP
       2020-04-10 16:08:54 +08:00
    @dtsdao #19 开源项目,没有什么生产 /测试服务器地址吧。 平时的业务项目,.env 放 git 里,也没毛病吧
    littleylv
        21
    littleylv  
       2020-04-10 16:10:47 +08:00   ❤️ 2
    不应该传.env
    要传.env.example
    然后 example 里注意不要写正式的,用通用字符代替,比如
    password=YOUR_PASSWORD (而不是 123abc )
    FaiChou
        22
    FaiChou  
    OP
       2020-04-10 16:11:58 +08:00
    @tabris17 #18 嗯,后端的就涉及 private_key 了,相对来说,前端用的都是些 public_key 。所以前端 public_key 也无所谓被 public 出去。
    momocraft
        23
    momocraft  
       2020-04-10 16:13:51 +08:00
    想做就做吧 我看别人花时间说服你也挺累的
    自己的东西自己负责而已
    FaiChou
        24
    FaiChou  
    OP
       2020-04-10 16:16:14 +08:00
    @momocraft #23 当然不可能这么做 ^_^,也不需要被说服。 想了解下前端 .env 放 ignore 中的其他理由。
    offline
        25
    offline  
       2020-04-10 16:22:06 +08:00
    .env.example 放注释

    .env.default 放默认,这个应
    offline
        26
    offline  
       2020-04-10 16:23:28 +08:00
    .env.example 放实例

    下面两个都应该忽略
    .env.default 放默认,这个应该在自己的服务器上生成,不提交 git
    .env 放本地私有
    hfpp2012
        27
    hfpp2012  
       2020-04-10 16:27:41 +08:00
    肯定不放 git 中呀
    kasper4649
        28
    kasper4649  
       2020-04-10 16:30:24 +08:00   ❤️ 2
    [x] .env
    [✓] .env.example
    ben1024
        29
    ben1024  
       2020-04-10 16:32:38 +08:00
    不放 .env, 进行线上编译才是正确
    BenX
        30
    BenX  
       2020-04-10 16:45:07 +08:00
    最佳实践来看,可以放一个样板同步上到 repo,例如 .env.example
    同步还要在 readme 中描述解释清楚里面需要有哪些变量。

    自己本地的 .env 就不要放到 repo


    PS,遇到过啃爹的一个项目就是 .env 没放,readme 也不说和写有哪些变量。
    要跑起来要不能抓到人,要不就只有自己看代码找去了
    jun0205
        31
    jun0205  
       2020-04-10 16:50:43 +08:00
    .env.example 需要
    redam
        32
    redam  
       2020-04-10 16:53:42 +08:00
    前端可以有.env.local,local 的就 ignore
    polun
        33
    polun  
       2020-04-10 17:17:53 +08:00
    如果放 git 里,就不需要 .env 了,直接静态变量不更好吗。
    ratatata
        34
    ratatata  
       2020-04-10 17:46:34 +08:00
    .env 不能放,但是应该放一个 .env.example,列出需要配置的变量
    MeteorCat
        35
    MeteorCat  
       2020-04-10 18:58:06 +08:00 via Android
    example.env ,之后忽略文件.env
    Chingim
        36
    Chingim  
       2020-04-10 19:09:45 +08:00 via Android
    不要教条主义,含敏感信息的就不要放,不含的无所谓,含有构建项目需要的信息(比如各种环境下的 API 地址)那就必须放到项目里
    Chingim
        37
    Chingim  
       2020-04-10 19:11:14 +08:00 via Android
    因为不同的项目从 env 文件中读取的信息都不一样,何必纠结。
    Kobayashi
        38
    Kobayashi  
       2020-04-10 19:38:38 +08:00 via Android
    不放。会放一个模板 .env.example
    msg7086
        39
    msg7086  
       2020-04-10 19:51:37 +08:00   ❤️ 1
    .env 从名字上来说就是对每个环境的分别配置。
    既然是对每个环境有效,当然不应该放在「对所有环境有效」的 Git 中。
    这和前端后端没有关系,这是.env 本身的身份决定的。
    是否 Public 和是否包含.env 没有直接关系。你源代码都是 Public 的,为什么变量不放在源码的配置文件里?
    RRRSSS
        40
    RRRSSS  
       2020-04-10 20:05:56 +08:00
    一般开源项目里都这么干:

    .env.simple 文件放 git,然后里面用变量表示,比如:

    DB_PASSWORD = ${your_password}

    然后 .env 加入 .gitignore

    最后 README 里加上,要用户 `cp .env.simple .env`,这样可以控制每个人是不同的配置,简单明了。
    wangyzj
        41
    wangyzj  
       2020-04-10 22:16:44 +08:00
    .env.example
    当然作为小透明
    我依然会放入.env
    WispZhan
        42
    WispZhan  
       2020-04-10 22:59:05 +08:00
    两个角度,结合起来:
    1. 看你是什么项目。 团队私有项目,开源项目? ……
    2. 看 env 里是啥。build / package 参数, 密钥, 服务器地址? ……

    涉及敏感信息的肯定不会直接放进去(脱敏), 否则无妨。
    qiaobeier
        43
    qiaobeier  
       2020-04-10 23:04:36 +08:00
    肯定不能啊。。。
    .env.example + 文档啊。
    zhw2590582
        44
    zhw2590582  
       2020-04-10 23:08:59 +08:00
    这要看你的.env 有什么信息,没什么重要信息就无所谓啦
    canadahetian
        45
    canadahetian  
       2020-04-10 23:11:09 +08:00
    肯定不应该,GIT 就放源码,其他任何东西不要放进去哦.
    现在用 docker,基本不用 vevn 了
    yuxing1171
        46
    yuxing1171  
       2020-04-11 00:07:10 +08:00
    肯定不应该啊
    amosasas
        47
    amosasas  
       2020-04-11 00:37:33 +08:00
    不应该 甚至应该建立一个专门的 secret server 来存放.env 然后分为.env.development .env.test .env.production 这样 然后分权限 跟 CI 环境设置好
    nvkou
        48
    nvkou  
       2020-04-11 00:54:07 +08:00 via Android
    .env 是给你程序用的
    你程序会不会泄露我管不着
    但你直接敞开大门欢迎来搞就过分了
    mattxlee
        49
    mattxlee  
       2020-04-11 01:42:37 +08:00
    我的理解是:分开来的,.local 的都不要放,其它的放,然后在写 env 变量的时候涉及密钥之类的东西都只能放在.local 里
    ljpCN
        50
    ljpCN  
       2020-04-11 02:09:47 +08:00 via Android
    比如你 mapbox 的 token,比如你测试环境下的后端域名,要么是要隐蔽,要么是部署时有不同的值,那么就不该推到仓库里。
    buffzty
        51
    buffzty  
       2020-04-11 02:37:50 +08:00
    2 个 env 文件
    .env 通用配置 上传到 git
    .env.local 本地隐私配置 不上传到 git
    jenkins 里 服务器隐私配置
    sansanhehe
        52
    sansanhehe  
       2020-04-11 09:10:04 +08:00
    .env
    .env.example
    .env.local
    .env.dev
    .env.stg
    .env.prd
    MengiNo
        53
    MengiNo  
       2020-04-11 09:30:58 +08:00 via iPhone
    不是涉密问题。 比如你的 env 里有个 app_name 你自己开发写的是 比如 my blog 或者更浮夸的 my secret base 。这个地方搞来搞去人家肯定要改的呀。既然抽象搭配 env 大多都是这种方便改的高度抽象的统一的东西。与其暴露你写的是什么(甚至还要让人猜你这个 my secret base 是意思是什么 这栏应该写什么) 还不如给个 env.example 然后 app_name 那栏写 YOU PROJECT NAME 这样注释性的话语 让他自己 cp 一份改一下。
    jay4497
        54
    jay4497  
       2020-04-11 14:24:52 +08:00
    我理解的,git 仓库里就不应该放那些会因为环境不同而变来变去的东西,.env 就是典型,类似的还有 .idea 、.vscode 等。。。
    starsriver
        55
    starsriver  
       2020-05-12 08:27:14 +08:00 via Android
    .env.example
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6022 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 02:08 · PVG 10:08 · LAX 18:08 · JFK 21:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.