Temos vários projetos .NET onde armazenamos certas configurações nos arquivos de configuração.
Agora, cada desenvolvedor terá seus próprios arquivos de configuração que diferem um pouco (strings de conexão diferentes para se conectar a bancos de dados locais, terminais WCF diferentes , etc.)
No momento, temos a tendência de verificar os arquivos app / web.config e modificá-los para atender às nossas necessidades.
Isso leva a muitos problemas, pois de vez em quando alguém verifica suas próprias configurações ou perde a configuração personalizada ao obter a versão mais recente do TFS .
Como você lida com situações como essa? Ou você não tem esse problema?
Respostas:
Usamos um sistema que combina várias das respostas existentes nesta página, além de recorrer a esta sugestão de Scott Hanselman .
Resumindo, o que fizemos foi ter um app.config / web.config comum e ter a maioria das configurações específicas em arquivos individuais, conforme sugerido por outras respostas aqui. por exemplo, para nossas configurações de SMTP, o app.config contém
Este arquivo está no controle de origem. No entanto, os arquivos individuais, como este, não são:
Mas não é bem aí que a história termina. E quanto a novos desenvolvedores ou uma nova instalação de código-fonte? A maior parte da configuração não está mais no controle de origem, e é uma dor construir manualmente todos os arquivos .config de que precisam. Eu prefiro ter uma fonte que pelo menos compile direto da caixa.
Portanto, mantemos uma versão dos arquivos .config no controle de origem, denominados arquivos .config.default . Uma nova árvore de origem, portanto, tem a seguinte aparência:
Ainda assim, não tem nenhuma utilidade para o desenvolvedor, já que para o Visual Studio eles são apenas arquivos de texto sem sentido. Portanto, o arquivo em lote
copy_default_config.bat
,, se encarrega de criar um conjunto inicial de arquivos .config a partir dos arquivos .config.default:O script pode ser reexecutado com segurança, pois os desenvolvedores que já possuem seus arquivos .config não os substituirão. Portanto, pode-se concebivelmente executar esse arquivo em lote como um evento de pré-construção. Os valores nos arquivos .default podem não ser exatamente corretos para uma nova instalação, mas são um ponto de partida razoável.
Em última análise, o que cada desenvolvedor acaba tendo é uma pasta de arquivos de configuração que se parece com isto:
Pode parecer um pouco complicado, mas é definitivamente preferível ao incômodo de desenvolvedores pisando nos calos dos outros.
fonte
Em seu Web.config, use a fonte de outros arquivos
Mantenha o web.config no controle de versão e não o faça para ConnectionStrings.config. Agora todos os desenvolvedores têm um arquivo para a string de conexão.
Você pode fazer isso para todas as configurações que dependem do local.
fonte
Aqui está uma solução para arquivos web.config e Visual Studio 2010:
1) Edite manualmente o arquivo .csproj do seu aplicativo da web para adicionar um
AfterBuild
destino como este:Esse destino transformará o arquivo Web.config correspondente ao desenvolvedor atual conectado - daí a
$(USERNAME)
variável -, com o arquivo correspondente criado em 1). Ele substituirá o Web.config local apenas se o conteúdo for alterado (para evitar a reinicialização) em cada compilação, mesmo se o Web.config local for controlado por origem, é por isso queOverwriteReadOnlyFiles
está definido como True. Este ponto é de fato discutível.2) Crie um arquivo com o nome
Web.[developer windows login].config
de cada desenvolvedor do projeto. (por exemplo, nas capturas de tela a seguir, tenho dois desenvolvedores chamados smo e smo2):Esses arquivos (1 por desenvolvedor) podem / devem ser controlados pela fonte. Eles não devem ser marcados como dependentes do Web.config principal porque queremos verificá-los individualmente.
Cada um desse arquivo representa uma transformação a ser aplicada ao arquivo Web.Config principal. A sintaxe de transformação é descrita aqui: Web.config Sintaxe de transformação para implantação de projeto de aplicativo da web . Reutilizamos esta tarefa de transformação de arquivo Xml que vem pronta para uso com o Visual Studio. O objetivo desta tarefa é mesclar elementos e atributos Xml em vez de sobrescrever todo o arquivo.
Por exemplo, aqui está um exemplo
web.[dev login].config
que altera uma string de conexão chamada 'MyDB', independentemente do resto do arquivo Web.config:Agora, esta solução não é perfeita porque:
Mas, pelo menos, você só precisa manter um web.config principal exclusivo, mais um arquivo de transformação por desenvolvedor.
Uma abordagem semelhante poderia ser adotada para arquivos App.config (não web), mas não entrei em detalhes.
fonte
web.default.config
quandoweb.$(USERNAME).config
não existe? A propósito, obrigado por esta ótima resposta.Estamos usando machine.config para evitar diferenças no web.config entre os ambientes.
fonte
Que tal ignorar o arquivo, para que nunca seja verificado? Eu encontrei um problema semelhante e adicionei web.config à lista de ignorados no Subversion.
No entanto, no TFS é um pouco mais difícil, veja este post sobre como fazer isso.
fonte
Uma maneira de lidar com isso é ter um sistema tokenizado e usar um script rake para alterar os valores.
Um método mais rudimentar poderia ser ter um link para um arquivo AppSettings.config para todos os AppSettings em seu web.config (semelhante com conexões), ou seja,
Em seguida, tenha uma pasta com cada um de seus desenvolvedores tem uma versão em uma subpasta (ou seja, / _configs / dave /). Então, quando um desenvolvedor está trabalhando em seu próprio código, ele copia da subpasta para a raiz da pasta vinculada.
Você precisará comunicar as alterações a esses arquivos (a menos que você faça token). Se você mantiver o arquivo AppSettings.config fora do controle de origem e apenas verificar as pastas individuais do desenvolvedor (todas elas), eles serão forçados a copiar a correta.
Eu prefiro a tokenização, mas pode ser mais difícil de colocar em funcionamento se isso for apenas uma solução rápida.
fonte
Ignore os arquivos e tenha um Commom_Web.Config e Common_App.Config. Usando um servidor de construção de integração contínua com tarefas de construção que renomeiam esses dois para nomes normais para que o servidor de construção possa fazer seu trabalho.
fonte
web.config
na pasta de origem é usada durante a depuração. Se você, por exemplo, adicionadoweb.config
ao.gitignore
e quer exigido aos usuários copiarCommom_Web.Config
paraweb.config
e editá-lo para sua fantasia, você faz parte do caminho até lá. Mas então, quando você precisa editar algo que é o mesmo em todas as máquinas do desenvolvedor, como asystem.web/compilation
seção ou particularappSettings
que deve ser o mesmo em todos os lugares, esse esquema falha.Temos o mesmo problema e o que estamos fazendo é
fonte
Supondo que você esteja usando o Visual Studio, por que não usa configurações de solução diferentes? Por exemplo: você pode ter uma configuração de depuração que usa Web.config.debug e uma configuração de versão que usa Web.config.release. Web.config.debug deve ter algo como
com o arquivo Standard_Name_For_Config.config que obtém todas as configurações pessoais do desenvolvedor, enquanto o Web.config.release sempre tem as configurações de produção. Você pode armazenar configurações padrão em alguma pasta de origem controlada e fazer com que um novo usuário as tire de lá.
fonte