在我的C#项目中有APIKeys.cs文件,其中包含带有API密钥的const字符串。 我希望这些字符串在Git服务器中是空的,但在我的本地计算机中有实际的API密钥。 因此,拉动项目的人可以毫无问题地编译它,并且我的本地计算机仍然可以在同一个文件中使用API密钥。
如果我尝试上传带有空字符串的APIKeys.cs文件,那么我就不能拥有带有API密钥的本地文件,因为当我尝试推送它时,它会覆盖空的APIKeys.cs文件。此外,我也不能忽略此文件,因为它将从Git服务器中删除空的APIKeys.cs文件。
那么这个问题的最佳自动化方法是什么,它允许在服务器中使用空字符串的类文件,所以当人们拉出它并在本地计算机上有真正的类文件时,项目是可编译的?
答案 0 :(得分:10)
接受您无法在公共空间中隐藏未加密的私钥。
您可以做的是将密钥移动到私有空间,然后从代码中引用该私有空间。
您的私人空间可能是环境变量或Windows注册表,它应该是您应用源代码之外的内容。
另一种方法是创建一个专门用于存储私钥的新配置文件(例如keys.config
),然后从源代码控制中排除此文件。
这意味着您不共享您的私钥,但这也意味着您需要记录(可能在readme.md中)用户需要重新创建自己的keys.config
。更好(感谢@Joey)是在解决方案中包含一个示例配置文件(keys.sample.config
),说明需要什么。
答案 1 :(得分:8)
我现在想出另一种解决方案,这种解决方案并不完美,但对我来说仍然足够好,例如:
APIKeys.cs
档案:
public static partial class APIKeys
{
public static readonly string ImgurClientID = "";
public static readonly string ImgurClientSecret = "";
public static readonly string GoogleClientID = "";
public static readonly string GoogleClientSecret = "";
public static readonly string PastebinKey = "";
...
}
APIKeysLocal.cs
档案:
public static partial class APIKeys
{
static APIKeys()
{
ImgurClientID = "1234567890";
ImgurClientSecret = "1234567890";
GoogleClientID = "1234567890";
GoogleClientSecret = "1234567890";
PastebinKey = "1234567890";
...
}
}
忽略Git中的APIKeysLocal.cs
文件,如果从解决方案资源管理器中删除此文件,那么没有此文件的人仍然可以编译项目。
如果使用项目预构建事件尚未存在,我还会自动创建空APIKeysLocal.cs
文件:
cd $(ProjectDir)APIKeys\
if not exist APIKeysLocal.cs (
type nul > APIKeysLocal.cs
)
这样用户无需做任何事情就可以编译项目。
答案 2 :(得分:4)
您有两种选择:
告诉Git忽略对本地计算机上APIKeys.cs
的更改:
git update-index --skip-worktree APIKeys.cs
这将导致本地更改不会被提交。如果您做想要提交对文件的更改,则必须使用--no-skip-worktree
标记撤消此操作。
将APIKeys.cs
文件重命名为APIKeys.template.cs
,包含您要共享的空字符串。将此文件保留在存储库中。将该文件复制到APIKeys.cs
。将APIKeys.cs
添加到.gitignore
。添加复制模板文件的说明,并使用本地设置进行修改。
git mv APIKeys.cs APIKeys.template.cs
$EDITOR APIKeys.template.cs
git commit
cat APIKeys.cs >> .gitignore
cp APIKeys.template.cs APIKeys.cs
答案 3 :(得分:1)
这与将构建号注入组件的问题非常相似吗?我这样做的方法是有一个预构建步骤,根据一些环境变量生成一个名为AssemblyVersionInfo.cs的文件。您可以使用API密钥执行相同的操作。
在编译API密钥的组件的预构建步骤中,输入如下内容: -
if not defined API_KEY set API_KEY=DEFAULT_KEY
echo public class ApiKeys>"$(SolutionDir)src\ApiKeys.cs"
echo {>>"$(SolutionDir)src\ApiKeys.cs"
echo public const string Key="%API_KEY%";>>"$(SolutionDir)src\ApiKeys.cs"
echo }>>"$(SolutionDir)src\ApiKeys.cs"
然后在本地计算机上设置用户或系统环境变量,其中包含真实密钥。
setx API_KEY THE_REAL_KEY
要避免Git想要提交文件,只需将其添加到.gitignore。