Ответ 1
Если у вас есть каталог vendor/bundle
в вашем проекте, а затем в какой-то момент , вы должны запустить команду bundle
с аргументом --path vendor/bundle
. Это приведет к загрузке файлов для всех ваших проектов (перечисленных в Gemfile
) в каталог vendor/bundle
в локальном проекте, а не в место расположения системных жемчужин. Вы сделаете это, чтобы полностью изолировать жемчужины проекта от любого другого проекта.
Бундлер хорош в разрешении всех зависимостей, поэтому нет необходимости использовать --path
, но некоторые люди предпочитают делать это, так как хотят сохранить свои драгоценные камни отдельно и организованными с помощью своего проекта. Это также означает, что связка на вашей локальной машине настроена так же, как Heroku использует bundler.
С помощью этой опции вы все равно загружаете все драгоценные камни с серверов rubygems
каждый раз, когда вы запускаете команду bundle
.
bundle package
делает еще один шаг и фактически загружает исходные файлы gem из rubygems
и кэширует их в каталог vendor/cache
. Это означает, что вам больше не нужно подключение к rubygems
для запуска команды bundle, поскольку она будет использовать упакованные файлы в качестве источника. Если вам нужно обновить версию gem, тогда вам нужно будет подключиться к rubygems
, чтобы собрать новую версию при первом запросе. Использование bundle package
, конечно, потребует дополнительного дискового пространства, которое может или не может быть проблемой в зависимости от ситуации. Это также увеличило бы требования времени на развертывание и пропускную способность каждый раз, когда вы нажимаете на Heroku.
Heroku запускает команду bundle
каждый раз, когда вы git push
, читаете ваш Gemfile.lock
и устанавливаете драгоценные камни, необходимые для работы приложения. По умолчанию используется опция --path vendor/bundle
. Это значит, что каждое приложение имеет набор gem файлов отдельно от всех других приложений на Heroku. Если у вас есть каталог vendor/bundle
в вашем исходном элементе управления, и вы нажимаете его на Heroku, тогда вы можете видеть, что существует потенциальная вероятность значительного конфликта, поскольку он затем пытается загрузить драгоценные камни в каталог vendor/bundle
, который уже существует. Если он нажат, Heroku удаляет каталог vendor/bundle
, прежде чем он запустит bundle install
, чтобы удалить эти потенциальные конфликты. Если это так, вы будете тратить время развертывания и пропускную способность, оставив vendor/bundle
под управлением версии, лучше добавить его в свой .gitignore
.
Если вы хотите полностью контролировать свои драгоценные камни на Heroku, используйте команду bundle package
и убедитесь, что каталог vendor/cache
находится под контролем источника. Когда Heroku запускает bundle install
, он будет использовать содержимое vendor/cache
как источник драгоценных камней, а не использовать rubygems
. Будет ли это полезно или нет, это будет вопрос личных предпочтений, тип приложения, которое вы строите, и как часто вы обновляете свои драгоценные камни. Сообщение Райана МакГери предполагает, что использование bundle package
полезно в случае, если старый камень станет недоступным в какой-то момент в будущем. Это, по-видимому, большая проблема для проектов/приложений, которые не регулярно обновляются.
С моей точки зрения, я обычно использую --path vendor/bundle
, чтобы моя локальная настройка была как можно ближе к Heroku's. Я помещал vendor/bundle
в файл проекта .gitignore
, и я не собираю камни, так как мои проекты обновляются относительно регулярно.
Rails имеет очень ограниченный файл .gitignore
. Ожидается, что вы создадите то, что вам нужно, поэтому vendor/bundle
по умолчанию не включен.
Я предполагаю, что Heroku означает bundle package
, когда говорят bundle pack
.