當工程師就是會有撞牆 debug 的時候Q
我設定 cicd variables
[gitlab]
# Gitlab personal access token
personal_access_token = ${PERSONAL_ACCESS_KEY}
[openai]
key = "$OPEN_AI_TOKEN"
引用的方式
from ..config_loader import get_settings
gitlab_access_token = get_settings().get("GITLAB.PERSONAL_ACCESS_TOKEN", None)-
def get_settings():
"""
Retrieves the current settings.
This function attempts to fetch the settings from the starlette_context's context object. If it fails,
it defaults to the global settings defined outside of this function.
Returns:
Dynaconf: The current settings object, either from the context or the global default.
"""
try:
return context["settings"]
except Exception:
return global_settings
current_dir = dirname(abspath(__file__))
global_settings = Dynaconf(
envvar_prefix=False,
merge_enabled=True,
settings_files=[join(current_dir, f) for f in [
"settings/.secrets.toml",
"settings/configuration.toml",
"settings/ignore.toml",
"settings/language_extensions.toml",
"settings/pr_reviewer_prompts.toml",
"settings/pr_questions_prompts.toml",
"settings/pr_line_questions_prompts.toml",
"settings/pr_description_prompts.toml",
"settings/pr_code_suggestions_prompts.toml",
"settings/pr_code_suggestions_reflect_prompts.toml",
"settings/pr_sort_code_suggestions_prompts.toml",
"settings/pr_information_from_user_prompts.toml",
"settings/pr_update_changelog_prompts.toml",
"settings/pr_custom_labels.toml",
"settings/pr_add_docs.toml",
"settings_prod/.secrets.toml",
"settings/custom_labels.toml"
]]
)
實際做個小實驗
a = "$TEST1"
b = "$TEST2"
c = "$PERSONAL_ACCESS_KEY"
import os
import toml
from os.path import abspath, dirname, join
from dynaconf import Dynaconf
current_dir = dirname(abspath(__file__))
global_settings = Dynaconf(
envvar_prefix=False,
merge_enabled=True,
settings_files=[join(current_dir, f) for f in [
"test.toml"
]]
)
# 打印設置內容
print("配置內容:")
for key in global_settings.keys():
print(f"{key}: {global_settings.get(key)}")
我們發現印出來是失敗的
A: $TEST1
B: $TEST2
C: $PERSONAL_ACCESS_KEY
但如果使用 toml 的解析
import os
import toml
from os.path import abspath, dirname, join
current_dir = dirname(abspath(__file__))
# 讀取 test.toml 文件
test_toml_path = join(current_dir, "test.toml")
try:
with open(test_toml_path, 'r') as f:
test_config = toml.load(f)
# 解析環境變數
for key, value in test_config.items():
if isinstance(value, str) and value.startswith('$'):
test_config[key] = os.getenv(value[1:], value) # 如果環境變數不存在,保留原值
# 打印解析後的配置
print("test.toml 配置:")
print(test_config)
except FileNotFoundError:
print(f"找不到 test.toml 文件: {test_toml_path}")
except Exception as e:
print(f"讀取 test.toml 時發生錯誤: {str(e)}")
卻可以得到值,原因是使用 Dynaconf 的方法: Dynaconf 是一個更高級的配置管理工具。默認情況下,它不會自動替換以 $
開頭的值為環境變量。這是為了安全性和靈活性考慮的。而直接使用 toml
庫的方法: 在這種方法中,您手動讀取 TOML 文件,然後顯式地使用 os.getenv()
來替換環境變量。這種方法直接且靈活,允許您完全控制環境變量的解析和替換過程。
直接使用 toml
庫的方法更直接,但需要您手動處理環境變量。
Dynaconf 提供了更強大和靈活的配置管理,但需要特定的語法和設置來處理環境變量。
通過自定義加載器,您可以讓 Dynaconf 的行為更接近於直接使用 toml
庫的方法。
選擇哪種方法取決於您的具體需求和項目的複雜度。如果您的配置需求相對簡單,直接使用 toml
可能更直接。如果您需要更複雜的配置管理(如多環境支持、動態重載等),Dynaconf 可能是更好的選擇。
我們有兩種方式將變數帶入,比較簡單的一種是變數加上 format
a = "@format {env[TEST1]}"