Git предполагает неизменным для всех [дублировать]

Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.

В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:

  1. Добавить RigidBody к вашему объекту с помощью AddComponent> Физика> Rigidbody Затем зайдите в свой скрипт и введите rb = GetComponent<Rigidbody>();. Эта строка кода работает лучше всего под ваши функции Start() или Awake().
  2. Вы можете добавить компонент программно и назначить переменную одновременно с одной строкой кода: rb = AddComponent<RigidBody>();

Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))] над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!

82
задан Ryan Fox 17 August 2008 в 03:13
поделиться

19 ответов

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

В общем, чем меньше файл переопределения, тем лучше, но он всегда может содержать больше настроек для разработчика с очень нестандартной средой.

63
ответ дан yukondude 31 August 2018 в 18:09
поделиться

Я использовал шаблон раньше, т. е. web.dev.config, web.prod.config и т. д., но теперь предпочитаю метод «переопределить файл». Файл web.config содержит большинство параметров, но внешний файл содержит значения, специфичные для среды, такие как соединения db. Хорошее объяснение в блоге Paul Wilson .

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

5
ответ дан Andy Whitfield 31 August 2018 в 18:09
поделиться

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

Так что если разработчик извлекает файлы из репозитория, там также присутствует конфиг разработчика. При изменении этого файла Git не должен знать об этих изменениях. Таким образом, изменения не могут быть перенесены / зафиксированы в репозиторий, но остаются локально.

Я решил это с помощью команды git: update-index --assume-unchanged. Я создал файл bat, который выполняется в предварительной структуре проектов, содержащих файл, изменения которого должны игнорироваться Git. Вот код, который я вложил в файл bat:

IF NOT EXIST %2%\.git GOTO NOGIT
set fileName=%1
set fileName=%fileName:\=/%
for /f "useback tokens=*" %%a in ('%fileName%') do set fileName=%%~a
set "gitUpdate=git update-index --assume-unchanged"
set parameter= "%gitUpdate% %fileName%"
echo %parameter% as parameter for git
"C:\Program Files (x86)\Git\bin\sh.exe" --login -i -c %parameter%
echo Make FIleBehaveLikeUnchangedForGit Done.
GOTO END
:NOGIT
echo no git here.
echo %2%
:END

В моей предварительной сборке я сделал бы вызов в файл bat, например:

call "$(ProjectDir)\..\..\MakeFileBehaveLikeUnchangedForGit.bat" "$(ProjectDir)Web.config.developer" "$(SolutionDir)"

Я нашел SO - файл bat, который копирует правильный файл конфигурации в файл web.config / app.config. Я также называю этот файл bat в prebuild. Код для этого файла bat:

@echo off
echo Comparing two files: %1 with %2
if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound
fc %1 %2 
if %ERRORLEVEL%==0 GOTO NoCopy
echo Files are not the same.  Copying %1 over %2
copy %1 %2 /y & goto END
:NoCopy
echo Files are the same.  Did nothing
goto END
:File1NotFound
echo %1 not found.
goto END
:File2NotFound
copy %1 %2 /y
goto END
:END
echo Done.

В моей предварительной загрузке я сделал бы вызов файла bat, например:

call "$(ProjectDir)\..\..\copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config
0
ответ дан Benjamin W. 31 August 2018 в 18:09
поделиться

Моя команда хранит отдельные версии конфигурационных файлов для каждой среды (web.config.dev, web.config.test, web.config.prod). Наши сценарии развертывания копируют правильную версию, переименовывая ее в web.config. Таким образом, у нас есть полный контроль версий в конфигурационных файлах для каждой среды, можно легко выполнить diff и т. Д.

10
ответ дан Brandon Wood 31 August 2018 в 18:09
поделиться

+1 в шаблоне.

Но поскольку у этого вопроса есть тег Git, распределенная альтернатива возникает, когда настройки сохраняются в частной ветви тестирования:

A---B---C---D---           <- mainline (public)
     \       \
      B'------D'---        <- testing (private)

В этой схеме основная строка содержит общий конфигурационный файл «шаблон», требующий минимального количества корректировок, чтобы стать функциональным.

Теперь разработчики / тестеры могут настроить файл конфигурации на содержание своего сердца, и только фиксировать эти изменения локально на одной частной ветви тестирования (например, B '= B + настройки). Каждый раз, когда продвигается магистраль, они легко объединяют ее в тестирование, что приводит к коммандам слияния, таким как D '(= D + объединенная версия настроек B).

Эта схема действительно сияет, когда файл конфигурации «шаблон» обновляется: изменения с обеих сторон объединяются и, скорее всего, приводят к конфликтам (или к ошибкам тестирования), если они несовместимы!

5
ответ дан Damien Diederen 31 August 2018 в 18:09
поделиться
  • 1
    Но когда разработчики тестировщиков нажимают на основную линию, их изменения в файл шаблона также будут введены. Нет? – Nick Zalutskiy 30 April 2009 в 02:16
  • 2
    Если не будет ответа на комментарий Ника, это не сработает из того, что я вижу. Или, может быть, объясните, какую модель потока вы используете, что бы решить проблему. – Alexander Bird 21 June 2011 в 15:00
  • 3
    Я согласен с шаблоном подхода с любыми необходимыми корректировками, испеченными во время сборки. Однако по теме ветвления ... Что делать, если было несколько шаблонов (dev, test и т. Д.), А разработчики просто пропускают изменения от своих коммитов. Не уверен, но может работать с сотрудничеством. – NickSuperb 6 October 2011 в 20:42

Конфигурация - это код, и вы должны ее версия. Мы основываем наши файлы конфигурации на именах пользователей; в UNIX / Mac и Windows вы можете получить доступ к имени пользователя, и если они уникальны для проекта, вы в порядке. Вы можете даже переопределить это в среде, но вы должны контролировать все версии.

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

21
ответ дан davetron5000 31 August 2018 в 18:09
поделиться
  • 1
    +1 абсолютно для того, чтобы подчеркнуть, что конфигурация все равно должна быть версией – Alexander Bird 21 June 2011 в 14:55
  • 2
    И если имя пользователя не является надежным по какой-либо причине, то вы можете иметь один файл с одной строкой, указывающей имя файла конфигурации переопределения. Таким образом, very мало (примерно в 10 символах), которые не контролируются версией. И файл README может объяснить, что вам нужно сделать этот файл. – Alexander Bird 21 June 2011 в 14:58

Я контролирую его, но никогда не нажимаю на другие серверы. Если производственный сервер требует изменения, я делаю это изменение непосредственно в файле конфигурации.

Возможно, он не очень красив, но он работает нормально.

3
ответ дан EndangeredMassa 31 August 2018 в 18:09
поделиться

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

Итак, вот как я это делаю. Это обычно для проектов nodejs, но я думаю, что он работает и для других фреймворков и языков.

Что я делаю, это создать каталог configs в корне проекта, а в этом каталоге хранить несколько файлов для всех сред (а иногда и отдельных файлов для среды каждого разработчика), которые отслеживаются в контроле источника. И есть фактический файл, который код использует named config в корне проекта. Это единственный файл, который не отслеживается. Таким образом, это выглядит так

root
|
|- config (not tracked)
|
|- configs/ (all tracked)
    |- development
    |- staging
    |- live
    |- James

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

И на серверах неизведанный файл может просто быть копией (или ссылкой) отслеживаемого файла, соответствующего этой среде. В JS вы можете просто иметь 1 строку, чтобы потребовать этот файл.

Этот поток может быть сначала немного сложным, но он имеет большие преимущества: 1. Вам никогда не придется беспокоиться о том, что файл конфигурации удаляется или изменяется на сервере без резервного копирования 2. То же самое, если у разработчика есть некоторая настраиваемая конфигурация на его машине, и его машина перестает работать по какой-либо причине. 3. Перед любым развертыванием вы можете различать файлы конфигурации для development и staging, например и посмотреть, нет ли чего-то, что не хватает или сломано.

1
ответ дан Gaafar 31 August 2018 в 18:09
поделиться

В настоящее время у меня есть конфигурационный файл «шаблон» с добавленным расширением, например:

web.config.rename

Однако, я вижу проблему с этим методом, если были изменены критические изменения.

7
ответ дан GateKiller 31 August 2018 в 18:09
поделиться

Не используйте этот файл. Версия шаблона или что-то еще.

21
ответ дан Grant 31 August 2018 в 18:09
поделиться
  • 1
    Я использую этот подход, у меня просто есть main.php.tmpl, и когда я проверяю новую копию, просто скопируйте ее в main, php. Я добавляю файл main.php в список игнорирования, чтобы избежать его совершения случайно. – levhita 15 September 2008 в 19:10

Проверенная версия приложения / web.config с обычным ванилом должна быть достаточно общей для работы на всех машинах разработчика и быть в курсе любых новых изменений настроек и т. д. Если вам нужен определенный набор настройки для параметров dev / test / production, проверьте отдельные файлы с этими настройками, как указано GateKiller, с каким-то соглашением об именах, хотя обычно я использую «web.prod.config», чтобы не изменять расширение файла.

3
ответ дан Greg Hurlman 31 August 2018 в 18:09
поделиться

У нас здесь две проблемы.

  • Сначала мы должны контролировать файл конфигурации, поставляемый с программным обеспечением. Разработчику достаточно легко проверить нежелательное изменение основного файла конфигурации, если они используют один и тот же файл в среде передачи. С другой стороны, если у вас есть отдельный файл конфигурации, который включен установщиком, очень легко забыть добавить к нему новый параметр или позволить комментариям в нем не синхронизироваться с комментариями при передаче Конфигурирование файла.
  • . Тогда у нас есть проблема, что разработчики должны постоянно обновлять копию конфигурационного файла, так как другие разработчики добавляют новые параметры конфигурации. Однако некоторые настройки, такие как строки подключения к базе данных, различны для каждого разработчика.
  • Существует 3-я проблема, которую вопрос / ответы не затрагивают. Как вы сходите на изменения, внесенные клиентом в файл конфигурации при установке новой версии вашего программного обеспечения?

Мне еще нужно см. хорошие решения, которые хорошо работают во всех случаях, однако я видел некоторые частичные решения (которые могут быть объединены в различные комбинации по мере необходимости), что значительно уменьшает проблему.

  • Сначала уменьшите количество элементов конфигурации, которые у вас есть в вашем основном файле конфигурации. Если вам не нужно позволять вашим клиентам изменять ваши сопоставления, используйте Fluent NHibernate (или иначе), чтобы переместить конфигурацию в код. Аналогично для установки установки вставки.
  • Разделите файл конфигурации, когда это возможно, например. используйте отдельный файл для настройки журнала Log4Net.
  • Не повторяйте элементы между множеством конфигурационных файлов, например. если у вас есть 4 веб-приложения, которые все установлены на одном компьютере, у вас есть общий файл конфигурации, на который указывает файл web.config в каждом приложении. (Используйте относительный путь по умолчанию, поэтому редко нужно менять файл web.config)
  • Обработать файл конфигурации разработки, чтобы получить файл конфигурации доставки. Это можно сделать с помощью значений по умолчанию в комментариях Xml, которые затем устанавливаются в файле конфигурации при выполнении сборки. Или разделы, которые были удалены как часть процесса создания установщика.
  • Вместо того, чтобы иметь только одну строку подключения к базе данных, имейте одну для разработчиков. Например, сначала найдите «database_ianr» (где ianr - мое имя пользователя или имя машины) в файле конфигурации во время выполнения, если он не найден, тогда найдите «базу данных». Сделайте 2-й уровень «eg -oracle или -sqlserver» make это быстрее для разработчиков, чтобы добраться до обеих систем баз данных. Это, конечно же, можно сделать и для любого другого значения конфигурации. Затем все значения, которые заканчиваются на «_userName», могут быть вычеркнуты перед отправкой файла конфигурации.

Однако в конце концов вы являетесь «владельцем файла конфигурации», который принимает ответственным за управление конфигурационными файлами (файлами), как указано выше или иным образом.

Вы не можете удалить необходимость в заботливом человеке, если это не проблема.

1
ответ дан Ian Ringrose 31 August 2018 в 18:09
поделиться

Я всегда сохранял все версии конфигурационных файлов в исходном элементе управления в той же папке, что и файл web.config.

Например

web.config
web.qa.config
web.staging.config
web.production.config

Я предпочитаю это (в отличие от web.config.production или production.web.config), потому что

  • Он хранит файлы вместе при сортировке по имени файла
  • Он сохраняет файлы вместе при сортировке по расширению файла
  • Если файл случайно попадает в производство, вы не сможете увидеть содержимое через http, потому что IIS предотвратит подачу файлов * .config

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

Самое главное, эти файлы должны быть почти на 100% идентичны в каждом аспекте, даже форматирование. Вы не должны использовать вкладки в одной версии и пробелы в другом для отступов. Вы должны иметь возможность запускать инструмент сравнения с файлами, чтобы увидеть, что между ними отличается. Я предпочитаю использовать WinMerge для различения файлов.

Когда ваш процесс сборки создает двоичные файлы, должна быть задача, которая перезаписывает файл web.config с конфигурационным файлом, соответствующим этой среде. Если файлы заархивированы, то ненужные файлы должны быть удалены из этой сборки.

4
ответ дан JackAce 31 August 2018 в 18:09
поделиться

Мы используем только один файл конфигурации (web.config / app.config), но добавляем специальный раздел к файлу, который содержит настройки для всех сред.

разделы LOCAL, DEV, QA, PRODUCTION, каждая из которых содержит ключи конфигурации, относящиеся к этой среде, в наших конфигурационных файлах.

Что делает всю эту работу сборкой с именем xxx.Environment, на которую ссылаются во всех наших приложений (winforms и webforms), которые сообщают приложению, в какой среде он работает.

Узел xxx.Environment читает одну строку информации из machine.config данного устройства, которая сообщает ему, что это на DEV, QA и т. д. Эта запись присутствует на всех наших рабочих станциях и серверах.

Надеюсь, что это поможет.

6
ответ дан Jason Stevenson 31 August 2018 в 18:09
поделиться
  • 1
    Это работает очень хорошо, если между средой (т. Е. Строками соединения) существует только несколько различий, – Eric Labashosky 26 April 2009 в 14:17
  • 2
    и предполагая, что нет 100-ти разработчиков, которые также ставят свои настроенные настройки (это все равно будет работать, но будет очень громоздким) – Alexander Bird 21 June 2011 в 14:53

В течение долгого времени я сделал именно то, что сделал bcwood. Я сохраняю копии web.dev.config, web.test.config, web.prod.config и т. Д. Под контролем источника, а затем моя система build / deploy автоматически переименовывает их по мере развертывания в различных средах. Вы получаете определенную избыточность между файлами (особенно со всеми материалами asp.net там), но в целом он работает очень хорошо. Вы также должны убедиться, что все в команде помнят, чтобы обновить все файлы, когда они вносят изменения.

Кстати, мне нравится держать «.config» в конец в качестве расширения, чтобы ассоциации файлов не были сломаны.

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

3
ответ дан jeremcc 31 August 2018 в 18:09
поделиться

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

2
ответ дан Rob Oxspring 31 August 2018 в 18:09
поделиться

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

1
ответ дан Ryan 31 August 2018 в 18:09
поделиться

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

Мы используем MSBuild в нашей автоматической сборке, поэтому мы используем задачу XmlUpdate из Задачи сообщества MSBuild для обновления значений.

3
ответ дан Sean Carpenter 31 August 2018 в 18:09
поделиться

@Grant прав.

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

Для нас это очень хорошо.

4
ответ дан Tom 31 August 2018 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: