Em nosso trabalho, temos vários aplicativos .net diferentes que compartilham muita funcionalidade básica. Criamos esses aplicativos usando uma arquitetura limpa de n camadas, mas chegamos ao momento em que percebemos que reimplementamos as mesmas funções várias vezes. Obviamente, isso viola a DRY, e gostaríamos de corrigir isso. Já estamos usando o Nuget com sucesso para obter códigos comuns de cola (conectando IoC, registro, configurações), mas também gostaríamos de compartilhar nossas camadas de dados e negócios entre todos os nossos aplicativos. A ideia é que a interface do usuário lide apenas com as partes da camada de negócios que realmente precisa.
Isso parece um problema direto no começo, mas o desenvolvimento contínuo pode fornecer algumas armadilhas e não temos certeza de como proceder. Digamos que criamos nossa camada de negócios única para governá-los todos. Por uma questão de brevidade, chamarei de "Fundação". Portamos nossos aplicativos para usar a Foundation, e tudo está indo muito bem. A Fundação é distribuída para iluminar as camadas da interface do usuário via nuget, e estamos com uma boa aparência. Mas então começamos a adicionar recursos aos nossos aplicativos e encontramos problemas.
Digamos que estamos trabalhando no Projeto A e adicionamos um novo recurso que requer alterações no Foundation. Fazemos as alterações na fundação (Foundation-A) e as empurramos para o feed de pepitas como um pacote instável. O Projeto A recebe o pacote mais recente de pepitas e tudo está bem. Enquanto isso, outro desenvolvedor está trabalhando no Projeto B. Ele obtém o Foundation mais recente do controle de origem, mas o retira de uma ramificação estável, para que não tenha alterações no Projeto A. Ele faz alterações e criou a Foundation-B. E tudo está bem. Porém, descobrimos que as funcionalidades de implementação Foundation-A e Foundation-B que realmente poderiam compartilhar código, então as combinamos. Enquanto isso, a Foundation-C está flutuando com suas próprias mudanças. Eventualmente, o Foundation-B está pronto para a produção, então nós o expomos. Mas precisamos atualizar a produção A, B,
Parece que poderia funcionar, mas estamos preocupados em trabalhar com diferentes esquemas de banco de dados e manter tudo sincronizado entre as várias ramificações do repositório Foundation, bem como os repositórios do Projeto A, B e C. Parece que provavelmente será necessário muito trabalho manual, o que abre a possibilidade de erros. Eu gostaria disso o mais automatizado possível.
Aqui está a pilha que estamos usando: C #, TFS com integração contínua, Nuget. Nossos aplicativos são todos os tipos de aplicativos ASP.NET. Estamos dispostos a olhar para diferentes SCMs, se isso facilitar as coisas.
Estou procurando maneiras de manter o Nuget com os nossos diferentes ramos de código-fonte. Não queremos inserir código de desenvolvimento acidentalmente em produção porque fazemos referência ao Pacote Nuget errado.