Use o grupo de bundler personalizado para joias de caixa de ferramentas binárias

Postado originalmente aqui

Existem muitas joias Ruby que fornecem interfaces de linha de comando úteis para tarefas de desenvolvimento.
A gem Garage Git eXtensions é um bom exemplo de um
aplicativo CLI que adiciona subcomandos Git adicionais para fluxos de trabalho de desenvolvimento comuns e há várias
outras joias que fornecem funcionalidades que vão desde a
interação com serviços de terceiros até a
simplificação de trabalhos tediosos .

O botão fácil

Bundler torna a distribuição de joias muito simples
, apenas adicionando uma linha ao seu Gemfile. É super fácil de garantir que toda a sua
equipe de desenvolvimento tem acesso à ferramentas e controle necessárias lançamento de novas versões ao longo do tempo.
Como essas joias são principalmente utilitários de desenvolvedor, você pode ficar tentado a salvá-las
em seu :developmentgrupo Bundler … mas PARE !

Estas são ferramentas … não bibliotecas!

group :development do
# FIXME!
# This actually loads thegarage/gitx.rb source
# into your application runtime
gem
"thegarage-gitx"
end

Por padrão, cada gem declarada no grupo é carregada automaticamente durante a inicialização do aplicativo, o que significa que todos os arquivos Ruby dentro dessas gemas serão incluídos em seu aplicativo . Isso não apenas incha o ambiente de tempo de execução do seu aplicativo, mas também tem potencial para efeitos colaterais desagradáveis ​​e inesperados quando o código-fonte CLI da gem, monkeypatches e todas as gemas de dependência são carregados em seu aplicativo em execução. Isso é tão ruim que algumas gemas CLI começaram a recomendar contra a inclusão da gema em seu Bundler Gemfile .:development





Como podemos obter os benefícios da distribuição simplificada entre equipes das
joias do conjunto de ferramentas fornecidas pelo Bundler e evitar poluir nosso ambiente de execução Ruby
com o código dessas joias?

Claro que podemos!

Bundler: requer sinalizador

Bundler na verdade suporta a capacidade de cancelar o comportamento de carregamento automático, passando
um sinalizador opcional para qualquer gem em seu Gemfilerequire: false .

group :development do
gem
"thegarage-gitx", require: false
end

Isso resolve o problema imediato, mas é um processo bastante manual adicionar essa opção a cada joia.
Conforme seu projeto cresce, também é muito fácil ignorar o sinalizador opcional e acidentalmente
adicionar uma nova gema que será incluída em seu tempo de execução. Alguma outra opção?

O: Toolbox Bundler Group

Os grupos de Bundler personalizados são uma forma extremamente eficaz de agrupar gemas relacionadas em depósitos exclusivos .
Vamos criar um novo grupo personalizado e enfiar todas essas joias em um grupo com o nome apropriado .:toolbox

group :toolbox do
gem
"thegarage-gitx"
gem
"bundler-reorganizer"
gem
"foreman"
gem
"travis"
end

Perfeito! Bundler carrega apenas um conjunto de grupos conhecidos
na aplicação em execução, então qualquer gem listada no grupo Bundler não será carregada automaticamente durante a inicialização do Rails. Nós também temos um conjunto expressivamente chamado de jóias que é facilmente identificável para futuras adições!:toolbox

NOTA: Você pode realmente dar o seu grupo qualquer nome que você vê o ajuste, enquanto ele é não um dos grupos padrão carregados por Bundler .:toolbox

[opcional] Exclua joias das implantações de produção

Como essas joias da caixa de ferramentas são usadas principalmente para fins de desenvolvimento, você pode
excluir essas joias da instalação em máquinas de produção.
O Bundler torna esse processo muito simples
por meio do bundle install --withoutcomando ou da variável de BUNDLE_WITHOUTambiente
. As implantações de produção geralmente excluem os grupos developmente test
por padrão, portanto, você só precisa adicionar o toolboxgrupo à lista também.

$ export BUNDLE_WITHOUT="development:test:toolbox"

Se você estiver implantando no Heroku, verifique a documentação para configurar variáveis ​​ambientais .