使用.gitignore分离开发和生产环境

5

我正在使用discord.py库学习Python并编写机器人。这些机器人需要API令牌,我希望将服务器上的功能性机器人与我正在开发的测试机器人分离。

我的环境设置有一个主分支和一个开发分支。我想让主分支的代码库适用于“测试机器人”,开发分支的代码库适用于“测试机器人Dev”。我的想法是将API令牌变量存储在未跟踪的文件中,并将该文件放置在服务器上。然后,在我的PC上有一个本地文件,其中包含相同的文件,但是将不同的令牌设置为变量。

虽然这种方法感觉有点hacky,但我想知道是否有更好的标准做法可以解决需要在dev和prod环境中使特定变量不同的情况。这是一个有点复杂的问题,所以我很难通过搜索找到解决方案。


2
环境变量可能是您最好的选择。您可以有一个单一的环境变量,例如 "ENVIRONMENT=dev";在启动时,您可以添加逻辑来根据变量选择正确的令牌:token = {'dev': 'xxxxxxxxx', 'test': 'eefdfsd'}[os.environ['ENVIRONMENT']] - Carlo Mazzaferro
太棒了,我刚刚查看了它们,它们非常有用。已经运行起来了。非常感谢。 - Dale Spiteri
1个回答

4
将需要的配置文件与应用程序一起放入配置管理(git)中,并忽略任何本地覆盖文件。
例如,在版本控制下放置名为.env.dist的文件,而.env文件位于同一项目的.gitignore文件中(在相同的路径下)。
# dot env
/.env

让您的实用程序/机器人默认加载任何.env.dist文件,并覆盖该.env.dist文件的.env文件。这样,您可以记录、计划和定义所需的环境变量,同时允许用户保留带有所有生产凭据的本地副本(如果需要)。
然后给您的机器人另一个参数来加载一个不同名称的环境(点env)文件,从而引领潮流。这使您能够以任何不同的配置运行机器人。
如果您遵循Docker CLI实用程序使用的环境文件的语法,那么您很可能非常互操作,并且可以在不放弃自由的情况下走得更远。
因此,请将此视为建议。

另一个提示:如果您想使用diff工具快速比较环境文件之间的差异,我可以提供的一个技巧是,如果您创建了节(否则您应该按名称排序环境参数(变量)名称),请为每个节添加标题(如果不在文件顶部)一个空行,一个单独的#注释,另一个带有部分名称# name of section和另一个单独的#行的注释。这为文本基础的diff工具提供了足够的信息来区分每个节(并与其他单行注释区分开来)。

#
# DISCORD API
#
DISCORD_ID
DISCORD_KEY

#
# MYSQL DATABASE
#
MYSQL_HOST
MYSQL_PASS
MYSQL_PORT
MYSQL_USER

(示例 .env.dist 文件提示需要参数,但未提供任何机密信息)
#
# DISCORD API
#
DISCORD_ID=42
DISCORD_KEY=aefdcd8d71d200efaefdcd8d71d200ef


#
# MYSQL DATABASE
#
MYSQL_HOST=example.com
MYSQL_PASS=root
MYSQL_PORT=34732
MYSQL_USER=root

(exemplary .env文件包含机密信息,并通过.gitignore在git项目中直接排除(不要添加!)。
将更多的“dot env”文件添加到.git/info/exclude中,或者如果您将此模式应用于整个开发系统,则添加到全局.gitignore中。阅读Git gignore Documentation中的描述,了解如何使用(多级)gitignore以及何时即使指定也不会忽略任何文件。

非常感谢。在第一个响应建议使用环境变量后,我阅读了相关资料并实现了它们,使得我的代码可以在操作系统中查找令牌。这将让我在服务器上设置令牌,并且每当我在本地运行代码库时,它将启动开发机器人。我认为这些解决方案相当相似?只是您正在使用不同的文件结构。使用您的方式与我设置的方式相比,有何优势吗? - Dale Spiteri
如果您只有一个参数,那么以单个环境变量开始听起来对我来说很好。但是随着这些环境变量变得越来越重要,如何记录要使用哪些环境变量,例如在不同系统上运行时。使用标准方法的 dot env 文件可以在这里提供帮助。它完全兼容仅限于环境的方法,并且也很容易从 dot env 文件加载到环境中,因此可以将其保留在具体实用程序之外。 - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接