Как заставить SVN игнорировать определенные строки кода в файле? - PullRequest
3 голосов
/ 14 декабря 2011

Я и мои друзья создаем программу и используем SVN для обмена кодом. Проблема в том, что мы используем в ней карты Google, поэтому нам нужно, чтобы у всех нас были разные ключи API. На данный момент мы прокомментировали строки наших ключей API в приложении, но это раздражает, если кто-то изменяет этот класс и фиксирует свой API.

Есть ли способ запретить фиксировать определенные строки кода в SVN?

Ответы [ 7 ]

5 голосов
/ 14 декабря 2011

Удалите жесткое кодирование из вашей программы, чтобы классы были универсальными (и могли быть зафиксированы в SVN).

Вместо этого сохраните ключ config / API во внешнем файле конфигурации или базе данных.Усовершенствуйте код для загрузки конфигурации из того места, где вы его сохранили, при запуске приложения.


Обновление:

Вот очень простой пример кода для созданияи используя файл свойств: http://www.bartbusschots.ie/blog/?p=360

1 голос
/ 14 декабря 2011

Этот тип конфигурации следует хранить снаружи в коде, обычно в файле свойств, вводя требуемое значение во время выполнения.

Обычно я использую ряд файлов свойств с org.springframework.beans.factory.config.PropertyPlaceholderConfigurer в Spring, каждый из которых позволяет при необходимости переопределять значения свойств для конкретного пользователя, что приводит к следующей конфигурации:

<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();
  }  
}    
1 голос
/ 14 декабря 2011

Правильный ответ «не делай этого», как уже говорили другие.

Если вы должны , конечно, лучше поставить все ваши различныевведите их, а затем выберите правильный во время компиляции (например, препроцессор C) или во время выполнения (например, на основе hostname).

1 голос
/ 14 декабря 2011

Неправильно хранить ключи в SVN.Это похоже на хранение там секретного кода вашей кредитной карты.O, вероятно, написание секретного кода на самой кредитной карте.

Эти ключи должны находиться за пределами SVN в вашей личной среде.Если вы не хотите создавать такие файлы, реализуйте возможность передавать ключ в качестве аргумента или системного свойства.

1 голос
/ 14 декабря 2011

Прежде всего, конфигурация не принадлежит коду.Напишите файл .properties и сохраните там ключ и остальные свойства.

После этого вам следует

1) зафиксировать копию файла свойств (возможно, properties_svn)

2) заставить ваш процесс сборки скопировать properties_svn в свойства, если последний не найден.

3) наслаждаться

1 голос
/ 14 декабря 2011

Может быть, вы можете использовать файл .properties, где вы можете хранить все ключи API, например, вы можете вызвать свойство myAPIKey, а остальные можно назвать как APIKey1, APIKey 2.

Если вы сделаете это, вам нужно всего лишь изменить имя свойства, которое вы хотите использовать, на myAPIKey и загрузить его в свой класс Java ...

0 голосов
/ 14 декабря 2011

Обычно такие вещи не являются частью инструмента управления версиями исходного кода. Большинство разработчиков решают эту или аналогичные проблемы с помощью системы сборки. Например. Maven.

Например, для maven кто-то может определять разные профили с разными файлами свойств для разных пользователей, имеющих разные ключи API или ссылки на папки и т. Д.

...