我和我的朋友们正在创建一个程序并使用SVN来共享代码。问题是我们在其中使用谷歌地图,因此我们需要所有人拥有不同的API密钥。现在我们在应用程序中注释了API键的行,但如果有人更改该类并使用其API提交,则会很烦人。
有没有办法告诉不要将某些代码行提交给SVN?
答案 0 :(得分:5)
从程序中删除硬编码,以便这些类是通用的(并且可以提交给SVN)。
而是将config / API密钥存储在外部配置文件或数据库中。增强代码,以便在应用程序启动时从您存储配置的任何位置加载配置。
<强>更新强>
以下是创建和使用属性文件的一个非常简单的代码示例:http://www.bartbusschots.ie/blog/?p=360
答案 1 :(得分:1)
也许您可以使用文件.properties,您可以在其中存储所有API密钥,例如,您可以调用属性myAPIKey,其他可以像APIKey1,APIKey 2一样调用。
如果这样做,您只需要将要使用的属性的名称更改为myAPIKey并将其加载到java类中......
答案 2 :(得分:1)
首先,配置不属于代码。编写.properties文件并在其中存储密钥和其余属性。
之后,你应该
1)提交属性文件的副本(可能是properties_svn)
2)如果找不到更晚的属性,则使构建过程将properties_svn复制到属性。
3)享受
答案 3 :(得分:1)
在SVN上存储密钥是不好的做法。这就像存储信用卡的密码一样。 O可能在信用卡上写密码。
这些密钥应该在私有环境中的SVN之外。如果您不想创建此类文件,则可以将密钥作为参数或系统属性传递。
答案 4 :(得分:1)
正确答案是“不要那样做”,正如其他人已经说过的那样。
如果你必须肯定最好将所有你的各种密钥放在那里,然后在编译时选择正确的密钥(例如C预处理器)或者运行时间(例如基于hostname
)。
答案 5 :(得分:1)
您应该在代码外部保留此类配置,通常在属性文件中,在运行时注入所需的值。
我通常使用Spring的org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
一系列属性文件,每个属性文件允许根据需要覆盖特定用户的属性值,从而产生以下配置:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="ignoreResourceNotFound" value="true"/>
<property name="order" value="1"/>
<property name="locations">
<list>
<value>classpath:my-system.properties</value>
<value>classpath:my-system-${HOST}.properties</value>
<value>classpath:my-system-${USERNAME}.properties</value>
</list>
</property>
</bean>
如果你没有使用Spring,你可以在这样的代码中实现同样的效果:
Properties properties = new Properties();
InputStream systemPropertiesStream = ClassLoader.getSystemResourceAsStream("my-system.properties");
if (systemPropertiesStream != null)
{
try
{
properties.load(systemPropertiesStream);
}
finally
{
systemPropertiesStream.close();
}
}
InputStream hostPropertiesStream = ClassLoader.getSystemResourceAsStream("my-system" + InetAddress.getLocalHost().getHostName() + ".properties");
if (hostPropertiesStream != null)
{
try
{
properties.load(hostPropertiesStream);
}
finally
{
hostPropertiesStream.close();
}
}
InputStream userPropertiesStream = ClassLoader.getSystemResourceAsStream("my-system" + System.getProperty("user.name") + ".properties");
if (userPropertiesStream != null)
{
try
{
properties.load(userPropertiesStream);
}
finally
{
userPropertiesStream.close();
}
}
答案 6 :(得分:0)
通常这些东西不是源代码版本控制工具的一部分。大多数开发人员使用构建系统解决了这个或类似的问题。例如。行家。
以maven为例,有人会为具有不同api密钥或文件夹引用等的不同用户定义具有不同属性文件的不同配置文件。