Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.
В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:
rb = GetComponent<Rigidbody>();
. Эта строка кода работает лучше всего под ваши функции Start()
или Awake()
. rb = AddComponent<RigidBody>();
Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))]
над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!
То, что я делал в прошлом, это иметь конфигурационный файл по умолчанию, который проверяется в исходном элементе управления. Затем у каждого разработчика есть свой собственный файл конфигурации переопределения, который исключается из исходного управления. Приложение сначала загружает значение по умолчанию, а затем, если файл переопределения присутствует, загружает его и использует любые параметры из переопределения, предпочитая файл по умолчанию.
В общем, чем меньше файл переопределения, тем лучше, но он всегда может содержать больше настроек для разработчика с очень нестандартной средой.
Я использовал шаблон раньше, т. е. web.dev.config, web.prod.config и т. д., но теперь предпочитаю метод «переопределить файл». Файл web.config содержит большинство параметров, но внешний файл содержит значения, специфичные для среды, такие как соединения db. Хорошее объяснение в блоге Paul Wilson .
Я думаю, что это уменьшает количество дублирования между конфигурационными файлами, которые могут вызвать боль при добавлении новых значений / атрибутов.
Я столкнулся с той же проблемой, и я нашел для нее решение. Я сначала добавил все файлы в центральный репозиторий (также разработчики).
Так что если разработчик извлекает файлы из репозитория, там также присутствует конфиг разработчика. При изменении этого файла 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
Моя команда хранит отдельные версии конфигурационных файлов для каждой среды (web.config.dev, web.config.test, web.config.prod). Наши сценарии развертывания копируют правильную версию, переименовывая ее в web.config. Таким образом, у нас есть полный контроль версий в конфигурационных файлах для каждой среды, можно легко выполнить diff и т. Д.
+1 в шаблоне.
Но поскольку у этого вопроса есть тег Git, распределенная альтернатива возникает, когда настройки сохраняются в частной ветви тестирования:
A---B---C---D--- <- mainline (public)
\ \
B'------D'--- <- testing (private)
В этой схеме основная строка содержит общий конфигурационный файл «шаблон», требующий минимального количества корректировок, чтобы стать функциональным.
Теперь разработчики / тестеры могут настроить файл конфигурации на содержание своего сердца, и только фиксировать эти изменения локально на одной частной ветви тестирования (например, B '= B + настройки). Каждый раз, когда продвигается магистраль, они легко объединяют ее в тестирование, что приводит к коммандам слияния, таким как D '(= D + объединенная версия настроек B).
Эта схема действительно сияет, когда файл конфигурации «шаблон» обновляется: изменения с обеих сторон объединяются и, скорее всего, приводят к конфликтам (или к ошибкам тестирования), если они несовместимы!
Конфигурация - это код, и вы должны ее версия. Мы основываем наши файлы конфигурации на именах пользователей; в UNIX / Mac и Windows вы можете получить доступ к имени пользователя, и если они уникальны для проекта, вы в порядке. Вы можете даже переопределить это в среде, но вы должны контролировать все версии.
Это также позволяет вам изучать конфигурации других, которые могут помочь диагностировать проблемы сборки и платформы.
Я контролирую его, но никогда не нажимаю на другие серверы. Если производственный сервер требует изменения, я делаю это изменение непосредственно в файле конфигурации.
Возможно, он не очень красив, но он работает нормально.
Я не думаю, что есть одно решение, которое работает для всех случаев, так как это может зависеть от чувствительности данных в файлах конфигурации или используемого вами языка программирования и многих других факторов. Но я думаю, что важно сохранять файлы конфигурации для всех сред под контролем источника, поэтому вы всегда можете знать, когда это было изменено, и кем и что еще более важно, иметь возможность восстановить его, если что-то пойдет не так. И они будут.
Итак, вот как я это делаю. Это обычно для проектов nodejs, но я думаю, что он работает и для других фреймворков и языков.
Что я делаю, это создать каталог configs
в корне проекта, а в этом каталоге хранить несколько файлов для всех сред (а иногда и отдельных файлов для среды каждого разработчика), которые отслеживаются в контроле источника. И есть фактический файл, который код использует named config
в корне проекта. Это единственный файл, который не отслеживается. Таким образом, это выглядит так
root
|
|- config (not tracked)
|
|- configs/ (all tracked)
|- development
|- staging
|- live
|- James
Когда кто-то проверяет проект, он копирует файл конфигурации, который он хочет использовать в файле untrecked config
, и он может редактировать его по своему усмотрению, но также ответственный за копирование этих изменений до того, как он приложит к другим файлам среды по мере необходимости.
И на серверах неизведанный файл может просто быть копией (или ссылкой) отслеживаемого файла, соответствующего этой среде. В JS вы можете просто иметь 1 строку, чтобы потребовать этот файл.
Этот поток может быть сначала немного сложным, но он имеет большие преимущества: 1. Вам никогда не придется беспокоиться о том, что файл конфигурации удаляется или изменяется на сервере без резервного копирования 2. То же самое, если у разработчика есть некоторая настраиваемая конфигурация на его машине, и его машина перестает работать по какой-либо причине. 3. Перед любым развертыванием вы можете различать файлы конфигурации для development
и staging
, например и посмотреть, нет ли чего-то, что не хватает или сломано.
В настоящее время у меня есть конфигурационный файл «шаблон» с добавленным расширением, например:
web.config.rename
Однако, я вижу проблему с этим методом, если были изменены критические изменения.
Не используйте этот файл. Версия шаблона или что-то еще.
Проверенная версия приложения / web.config с обычным ванилом должна быть достаточно общей для работы на всех машинах разработчика и быть в курсе любых новых изменений настроек и т. д. Если вам нужен определенный набор настройки для параметров dev / test / production, проверьте отдельные файлы с этими настройками, как указано GateKiller, с каким-то соглашением об именах, хотя обычно я использую «web.prod.config», чтобы не изменять расширение файла.
У нас здесь две проблемы.
Мне еще нужно см. хорошие решения, которые хорошо работают во всех случаях, однако я видел некоторые частичные решения (которые могут быть объединены в различные комбинации по мере необходимости), что значительно уменьшает проблему.
blockquote >
- Сначала уменьшите количество элементов конфигурации, которые у вас есть в вашем основном файле конфигурации. Если вам не нужно позволять вашим клиентам изменять ваши сопоставления, используйте Fluent NHibernate (или иначе), чтобы переместить конфигурацию в код. Аналогично для установки установки вставки.
- Разделите файл конфигурации, когда это возможно, например. используйте отдельный файл для настройки журнала Log4Net.
- Не повторяйте элементы между множеством конфигурационных файлов, например. если у вас есть 4 веб-приложения, которые все установлены на одном компьютере, у вас есть общий файл конфигурации, на который указывает файл web.config в каждом приложении. (Используйте относительный путь по умолчанию, поэтому редко нужно менять файл web.config)
- Обработать файл конфигурации разработки, чтобы получить файл конфигурации доставки. Это можно сделать с помощью значений по умолчанию в комментариях Xml, которые затем устанавливаются в файле конфигурации при выполнении сборки. Или разделы, которые были удалены как часть процесса создания установщика.
- Вместо того, чтобы иметь только одну строку подключения к базе данных, имейте одну для разработчиков. Например, сначала найдите «database_ianr» (где ianr - мое имя пользователя или имя машины) в файле конфигурации во время выполнения, если он не найден, тогда найдите «базу данных». Сделайте 2-й уровень «eg -oracle или -sqlserver» make это быстрее для разработчиков, чтобы добраться до обеих систем баз данных. Это, конечно же, можно сделать и для любого другого значения конфигурации. Затем все значения, которые заканчиваются на «_userName», могут быть вычеркнуты перед отправкой файла конфигурации.
Однако в конце концов вы являетесь «владельцем файла конфигурации», который принимает ответственным за управление конфигурационными файлами (файлами), как указано выше или иным образом.
blockquote>Вы не можете удалить необходимость в заботливом человеке, если это не проблема.
Я всегда сохранял все версии конфигурационных файлов в исходном элементе управления в той же папке, что и файл web.config.
Например
web.config
web.qa.config
web.staging.config
web.production.config
Я предпочитаю это (в отличие от web.config.production или production.web.config), потому что
Конфигурационный файл по умолчанию должен быть настроен таким образом, чтобы вы могли запускать приложение локально на своем собственном компьютере.
Самое главное, эти файлы должны быть почти на 100% идентичны в каждом аспекте, даже форматирование. Вы не должны использовать вкладки в одной версии и пробелы в другом для отступов. Вы должны иметь возможность запускать инструмент сравнения с файлами, чтобы увидеть, что между ними отличается. Я предпочитаю использовать WinMerge для различения файлов.
Когда ваш процесс сборки создает двоичные файлы, должна быть задача, которая перезаписывает файл web.config с конфигурационным файлом, соответствующим этой среде. Если файлы заархивированы, то ненужные файлы должны быть удалены из этой сборки.
Мы используем только один файл конфигурации (web.config / app.config), но добавляем специальный раздел к файлу, который содержит настройки для всех сред.
разделы LOCAL, DEV, QA, PRODUCTION, каждая из которых содержит ключи конфигурации, относящиеся к этой среде, в наших конфигурационных файлах.
Что делает всю эту работу сборкой с именем xxx.Environment, на которую ссылаются во всех наших приложений (winforms и webforms), которые сообщают приложению, в какой среде он работает.
Узел xxx.Environment читает одну строку информации из machine.config данного устройства, которая сообщает ему, что это на DEV, QA и т. д. Эта запись присутствует на всех наших рабочих станциях и серверах.
Надеюсь, что это поможет.
В течение долгого времени я сделал именно то, что сделал bcwood. Я сохраняю копии web.dev.config, web.test.config, web.prod.config и т. Д. Под контролем источника, а затем моя система build / deploy автоматически переименовывает их по мере развертывания в различных средах. Вы получаете определенную избыточность между файлами (особенно со всеми материалами asp.net там), но в целом он работает очень хорошо. Вы также должны убедиться, что все в команде помнят, чтобы обновить все файлы, когда они вносят изменения.
Кстати, мне нравится держать «.config» в конец в качестве расширения, чтобы ассоциации файлов не были сломаны.
Что касается локальных версий конфигурационного файла для разработчиков, я всегда стараюсь изо всех сил побуждать людей использовать те же локальные настройки, насколько это возможно так что нет необходимости иметь свою собственную версию. Это не всегда работает для всех, и в этом случае люди обычно просто заменяют его локально по мере необходимости и идут оттуда. Это не слишком больно или что-то еще.
В нашем проекте мы сохраняем конфигурацию, хранящуюся в файлах с префиксом, тогда наша система сборки выберет соответствующую конфигурацию на основе имени хоста текущей системы. Это хорошо работает для нас в относительно небольшой команде, что позволяет нам применять изменения конфигурации в файлах других людей, если / когда мы добавляем новый элемент конфигурации. Очевидно, что это определенно не масштабируется для проектов с открытым исходным кодом с неограниченным числом разработчиков.
Мы просто сохраним файл конфигурации производства. Обязанностью разработчика является изменение файла, когда он вытаскивает его из безопасного источника для постановки или разработки. Это сожгло нас в прошлом, поэтому я бы не предложил этого.
Мы используем конфигурационный файл шаблона, который проверяется на управление версиями, а затем шаг в нашей автоматизированной сборке для замены определенных записей в файле шаблона настройками среды. Спецификации, специфичные для среды, хранятся в отдельном файле XML, который также находится под управлением версиями.
Мы используем MSBuild в нашей автоматической сборке, поэтому мы используем задачу XmlUpdate из Задачи сообщества MSBuild для обновления значений.
@Grant прав.
Я нахожусь в команде, у которой около 100 других разработчиков, и наши файлы конфигурации не проверены в исходном элементе управления. У нас есть версии файлов в репозитории, которые вытаскиваются с каждой проверкой, но они не меняются.
Для нас это очень хорошо.