我和我的朋友正在创建一个程序并使用SVN来共享代码。问题是我们在其中使用谷歌地图,所以我们需要我们所有人拥有不同的API密钥。现在我们已经在应用程序中注释了我们的API密钥的行,但是如果有人改变了这个类并且提交了他的API,这是令人讨厌的。如何让SVN忽略文件中的某些代码行?
有没有办法告诉不要将某些代码行提交给SVN?
我和我的朋友正在创建一个程序并使用SVN来共享代码。问题是我们在其中使用谷歌地图,所以我们需要我们所有人拥有不同的API密钥。现在我们已经在应用程序中注释了我们的API密钥的行,但是如果有人改变了这个类并且提交了他的API,这是令人讨厌的。如何让SVN忽略文件中的某些代码行?
有没有办法告诉不要将某些代码行提交给SVN?
从您的程序中删除硬编码,以便这些类是通用的(并且可以提交给SVN)。
而是将config/API密钥存储在外部配置文件或数据库中。增强代码以在应用程序启动时从您存储它的任何地方加载配置。
更新:
下面是创建和使用属性文件一个非常简单的代码示例:http://www.bartbusschots.ie/blog/?p=360
问题是如何让SVN忽略某些行,而不是如果选择的方法是正确的。 –
通常这样的事情是不是源代码版本控制工具的一部分。大多数开发人员使用构建系统来解决这个问题或类似的问题例如。行家。
与Maven例如某人具有不同的API密钥或文件夹引用等
将定义与不同用户的不同属性文件不同的配置文件也许你可以将用户文件的.properties,在这里你可以存储所有的API键,例如你可以调用一个属性myAPIKey,其他可以被称为像APIKey1,APIKey 2.
如果你这样做,你只需要改变你想使用的属性的名称myAPIKey并加载它在你的java类...
首先,配置不属于码。编写一个.properties文件并在那里存储密钥和其他属性。
之后,你应该
1)提交属性的副本文件(也许properties_svn)
2)使你的构建过程中,复制properties_svn到性能,如果后来没有找到。
3)享受
这是不好的做法,在SVN存储密钥。这就像在你的信用卡上存储密码。 O可能在信用卡本身上写保密码。
这些密钥应该位于私有环境的SVN之外。如果你不想创建这样的文件实现传递键作为参数或系统属性的能力。
正确的答案是“不要这样做”,正如其他人已经说过的那样。
如果必须肯定这是更好地把所有你的各种按键在那里,然后或者选择在编译时正确的(例如C预处理器),或在运行时(例如基于hostname
)。
您应该在代码外部持有这种类型的配置,通常在属性文件中,在运行时注入所需的值。
我通常使用一系列的属性文件中使用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>
如果你不使用春天你可以达到这样的代码相同的效果:
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();
}
}
为什么你不共享一个API密钥? –
@Matjaz因为谷歌需要不同地点的不同密钥。 – ams
您可以将cnofiguration移动到某个静态java文件,或者更好地移动到资源包(.properties文件)和“svn忽略”它。 –