Saiba como configurar uma Gatsby Tema do Projeto com Lerna: este guia vai ajudar você a entender o que é um mono-repo e como gerenciá-lo com Lerna usando NPM em vez de Fios de espaços de trabalho.
Index
- What is Lerna and why it’s worth a try?
- Configuração de Lerna com a NGP, a partir da shell
- Andaime pastas e arquivos com a shell
- Usando Lerna
- Escolha a sua abordagem
- Orquestrar tudo com Lerna bootstrap
- Executar comandos e scripts
- Assistente de Actualização
o Que é Lerna, e por que vale a pena tentar?
comecei a seguir o curso de autoria do tema Gatsby de Jason Lengstorf (@jlengstorf) e logo percebi que eu não sei nada sobre ‘espaços de trabalho de fios’. É uma maneira bonita de gerir o que se chama mono-repo.: um repositório que tem mais de um projeto dentro e pode compartilhar dependências.
por doppelmutzi de doppelmutzi.github.io:
tais projetos são chamados de espaços de trabalho ou pacotes. Em contraste, usando múltiplos repositórios com cada repositório abrigando apenas um projeto é chamado de uma abordagem multi-Repo.
uma coisa que me surpreendeu com a abordagem mono-repo foi que os meus pacotes/espaços de trabalho podem partilhar localmente as mesmas dependências node_modules
. Isto poupa-me tempo e espaço físico.Lerna e os espaços de trabalho do fio nos dão a capacidade de construir bibliotecas e aplicativos em um único repo, sem nos forçar a Publicar para npm ou outros registros. A beleza por trás dessas tecnologias é que eles podem encontrar dependências de pacotes analisando pacote.ficheiros json localizados na pasta raiz de cada projecto. Assim, essas ferramentas tornam obsoleto para criar manualmente ligações simbólicas ou usar o link npm de “baixo nível” diretamente.
agora, mesmo se você já está usando yarn workspaces
eu acho que Lerna vale a tentativa porque ele fornece uma série de vantagens. Além disso você poderia usar Lerna com espaços de trabalho de fios:
com um comando lerna você pode iterar através de todos ou pacotes particulares, executando uma série de operações (tais como linting, testing e building) em cada pacote. Assim, complementa os espaços de trabalho de fios que assume o processo de gestão de dependência.
então finalmente eu decidi aprender Lerna-Desculpe para o twister língua-mas eu não queria mudar para o fio (uma vez que eu estou apenas confortável com npm). Foi assim que consegui que funcionasse.:
Configuração de Lerna com a NGP, a partir da shell
Crie um diretório para o seu projeto e enter sobre ele com este comando:
mkdir try-lernacd try-lerna
Você pode instalar Lerna globalmente (npm i -g lerna
) ou usá-lo com npx.
-
Init lerna
npx lerna init --independent
Isto irá:
-
init
um repositório git - criar uma
package.json
- criar uma
lerna.json
- criar uma
packages
pasta (aqui você pode colocar seus espaços de trabalho).
pacotes é como lerna chama espaços de trabalho.
você pode organizar os pacotes como quiser, se preferir você pode colocar todos os pacotes na pasta de raiz e, em seguida, mudar o array, a fim de corresponder (como uma abordagem de “espaços de trabalho de fios”).
My lerna.json arquivo tem stream: true
(para ver gatsby saída quando executado desenvolver com lerna) e hoist: true
(a fim de talha node_modules também com o comando lerna add
; eu vou explicar este último recurso para a frente):
{ "packages":, "version":"independent", "stream":true, "command":{ "bootstrap":{ "hoist":true } }}
Você pode adicionar manualmente ou usar este comando simples da shell:
echo "{\r\t\"packages\":,\r\t\"version\":\"independent\",\r\t\"stream\":true,\r\t\"command\":{\r\t\t\"bootstrap\":{\r\t\t\t\"hoist\":true\r\t\t}\r\t}\r}" > lerna.json
pastas e arquivos de andaimes com shell
esta seção pode ser feita manualmente seguindo a primeira lição do curso de Jason Lengstorf ligado na introdução.Apenas recolho todas as passagens básicas, a fim de realizá-las com poucos comandos da shell.
No caso de você querer usar a minha abordagem lembre-se de substituir “NOME” com o nome do seu tema e, em seguida, basta copiar e colar este comandos:
mkdir -p packages/{gatsby-theme-NAME,site}
touch packages/{gatsby-theme-NAME,site}/{index.js,package.json}
echo "//loop" >> packages/{gatsby-theme-NAME,site}/index.js
conteúdo Inicial do pacote.json na pasta do site:
echo "{\r\t\"private\":true,\r\t\"name\":\"site\",\r\t\"version\":\"1.0.0\",\r\t\"license\":\"MIT\",\r\t\"scripts\":{\r\t\t\"builds\":\"gatsby build\",\r\t\t\"develop\":\"gatsby develop\",\r\t\t\"clean\":\"gaysby clean\"\r\t}\r}" >> packages/site/package.json
pacote.json na pasta do tema (substitua o NOME de novo e também inserir YOUR_NPM_USER):
echo "{\r\t\"name\": \"@YOUR_NPM_USER/gatsby-theme-NAME\",\r\t\"version\": \"1.0.1\",\r\t\"license\": \"MIT\",\r\t\"main\": \"index.js\",\r\t\"scripts\": {\r\t\t\"builds\": \"gatsby build\",\r\t\t\"develop\": \"gatsby develop\",\r\t\t\"clean\": \"gaysby clean\"\r\t}\r}" >> packages/gatsby-theme-NAME/package.json
Aqui está o resultado:
├── packages│ ├── site│ └── gatsby-theme-NAME├── .gitignore├── package.json└── lerna.json
PS: aconselho você a criar um .gitignore
e adicionar node_modules
imediatamente:
echo "node_modules" > .gitignore
Usando Lerna
Um problema com Lerna é que você não pode instalar várias dependências por Pacote, com um único comando (como você faz com yarn workspace name_workspace add package1 package2 etc
). Você precisa fazer isso um a um, assim (se você não instalou globalmente você terá que preceder cada comando com npx
):
lerna add gatsby --scope site
lerna add react --scope site
lerna add react-dom --scope site
Aqui --scope site
é usado para dizer Lerna para instalar apenas o Pacote “site”.
no Entanto, você pode instalar uma dependência, digamos gatsby
, para cada Pacote, com apenas um comando:
lerna add gatsby
Este comando irá:
- Instalar Gatsby para cada Pacote (nesse caso, portanto, para o Site e também para o Pacote do Tema).
- se tiver permitido
hoist
no lerna.json irá criar uma pasta node_ modules na sua raiz (ver ‘Lerna Bootstrap forward’):
escolha a sua abordagem
se gostar desta abordagem pode continuar a instalar todas as dependências comuns (react
, react-dom
) nos pacotes. Se você precisar instalar algumas dependências apenas para um Pacote usar --scope name_of_the_package
(lembre-se que é o nome especificado no Pacote.json não é o nome da pasta).
Poderá também usar o npm instalando todas as dependências que desejar no respectivo pacote. Mas lembre-se que esta abordagem irá instalar uma dependências node_ modules para cada pasta respectiva. Isto pode ser limpo e depois içado. Embora esta opção seja válida, levará mais tempo.
Qualquer opção que você escolher, lembre-se de adicionar/link do Tema local como um Pacote de dependência para o Pacote de Site (use o nome que você definir no package.json
):
lerna add @YOUR_NPM_USER/gatsby-theme-NAME --scope=site
Orquestrar tudo com Lerna bootstrap
No final, você pode fazer com segurança:
lerna bootstrap
Este comando é muito útil, especialmente se você já tem o seu pacote.json preencheu com suas respectivas dependências.
com opção hoist: true
(em lerna.json
) irá colocar uma pasta partilhada node_modules
localizada na raiz, então irá ligar as dependências locais nas respectivas package.json
.
I really like –hoist feature it’s a process that avoid duplicated dependencies on the node_ modules, so it saves physical space and installation time.Se, por qualquer razão, quiser limpar alguma coisa primeiro, pode fazer:
lerna clean && lerna link && lerna bootstrap
executar comandos e programas
para executar programas (colocados no package.json
) terá de indicar (ou não) o pacote de destino:
lerna run develop --scope Package_name
Lerna também permite que você execute quaisquer comandos da raiz para cada pacote (use dash). Por exemplo:
lerna exec -- rm -rf node_modules
isto irá remover os módulos do nó em cada pasta de pacotes.
Assistente de Actualização
No futuro, quando você precisará atualizar seus pacotes você pode usar o update-assistente:
npm install --save-dev lerna-update-wizard
em seguida, você precisará executar apenas este comando e o assistente irá ajudá-lo:
lernaupdate