Eu tenho um código-fonte gerenciado pelo git que quero enviar para o Heroku. O código-fonte contém vários produtos diferentes, alguns dos quais terão sua própria instância do heroku. Então, algo assim:
src/
lib-files/
app1/
app2/
app3/
other-files/
package.json
Portanto, no heroku, tenho uma instância para app1 e app2. Ambos dependem de ./lib-files e package.json, mas não de app2 ou app3 ou outros arquivos.
Eu realmente não quero empurrar todo o gitrepositório contendo todos os arquivos para heroku para cada aplicativo. Em outras palavras, eu não quero que a instância app1 contenha o código para app2 ou app3 ou outros arquivos porque há muitos dados que ela não precisa e leva uma eternidade para copiá-los.
Eu resolvi isso criando novos repositórios git paracada aplicativo (um que contém apenas as coisas que o app1 precisa e outro para o app2, etc) e, em seguida, enviar esses repositórios individuais para o heroku. Isso funciona, mas parece um pouco hackeado porque tenho todos esses outros repositórios extras que preciso gerenciar. Além disso, se outros desenvolvedores quiserem fazer push para o heroku, preciso disponibilizar esses repositórios para eles, talvez verificando-os no git (parece bizarro).
O que é uma boa maneira de conseguir isso?
Atualizar:</ strong>
E se eu criasse os repositórios heroku para que eles apenascontinha o material apropriado para cada aplicativo, então apenas deixe o heroku ser o controle remoto principal para esses repositórios (em oposição ao github)? Eu ainda teria vários repositórios para lidar, mas pelo menos todos os desenvolvedores teriam um local padrão para cloná-los (o repositório de código-fonte estando no github e os repositórios de implantação do heroku no heroku). O que você acha disso?
Respostas:
5 para resposta № 1A solução que eu escolheria é a ramificação. Você tem o branch master que contém todos os arquivos e, em seguida, um branch para cada aplicativo que contém apenas o que é necessário.
Por exemplo:
$ git init
$ git add .
$ git commit -m "Initial commit"
$ git checkout -b app1 # create a new branch for app1 derived from master
$ git rm what-you-dont-need-for-app1
$ git commit -m "Initial app1 commit"
$ git checkout master # switch to master again
$ git checkout -b app2
$ # repeat same steps as for app1
Você também pode ter um exclusivo .gitignore
-file em cada branch para dizer ao git o que você não quer cometer.
1 para resposta № 2
A maneira que acabei fazendo isso foi deixando o herokualojam os controles remotos primários para as versões dos aplicativos que são implantados lá. Enquanto isso, o principal repositório de código-fonte em que todos trabalham está no github. Suponha que o código seja assim:
src/
app1/
app2/
app3/
lib-files/
other-files/
package.json
Então eu tenho dois aplicativos heroku para app1 e app2. Eles contêm apenas o código necessário para cada aplicativo:
app1:
src/
app1/
lib-files/
other-files/
package.json
app2:
src/
app2/
lib-files/
other-files/
package.json
Quando você deseja trabalhar no código-fonte, clona a versão completa do github. Quando você deseja implantar no heroku, você clona um dos repositórios de aplicativos de lá.
Criei um script para implantar cada aplicativo que faz o seguinte:
- Clone o repositório git do heroku se ele ainda não existir na caixa local
- Copie apenas os arquivos necessários apenas para esse aplicativo do repositório de origem principal para o repositório heroku
- Confirme as mudanças
- Envie o repositório para heroku
Um problema que encontrei é que cada um dos meus aplicativostem seu próprio aplicativo Node.js e normalmente inicio cada um em meu ambiente de desenvolvimento indo para esse diretório e executando o comando node:
cd app1
node server.js
No entanto, isso não funciona bem assim emHeroku porque espera que os arquivos Procfile e package.json estejam no diretório mais externo do repositório git. Meu arquivo package.json já está localizado lá, mas tive que criar Procfiles separados para cada aplicativo e copiá-los, dependendo de qual estou implantando. Cada um deles se parece com isto por dentro:
web: node app1/app.js
De qualquer forma, essa configuração parece funcionar.
0 para resposta № 3
Eu tive exatamente o mesmo problema (como imaginei que muitosfazer) e escolher de forma diferente: eu tenho um repositório separado para cada aplicativo e um repositório para o código compartilhado. Eu compartilho o código entre os aplicativos localmente no disco e no Heroku via requirements.txt. Aqui está o meu tópico de SO:
Compartilhando código Python entre aplicativos Heroku