Em ALM com TFS / VSTS.
blogando sobre Gerenciamento de Ciclo de Vida de Aplicativos com o TFS / VSTS.
Estratégia Global de Versão. NET & # 8211; AssemblyInformationalVersion.
Já ouviu falar de um terceiro atributo de versão (opcional) nos arquivos AssemblyInfo: AssemblyInformationalVersion. Não? Por favor leia!
Sem uma estratégia de numeração de versão metódica (montagem), a capacidade de determinar quais alterações foram incluídas em qual versão foi perdida. Na minha opinião, você sempre precisa saber exatamente quais arquivos de origem entraram em qual build e qual versão do software está implantada atualmente em um ambiente específico. Um sistema de numeração de versão aleatória cria confusão e, mais cedo ou mais tarde, causa riscos de implantação. Será um pesadelo buscar os arquivos de origem exatos para reproduzir um bug da produção.
Todos os versionamentos de assemblies. NET que usam o common language runtime são feitos no nível do assembly. A versão específica de um assembly e as versões de assemblies dependentes são registradas no manifesto do assembly. A política de versão padrão para o tempo de execução é que os aplicativos são executados apenas com as versões com as quais foram construídos e testados, a menos que sejam substituídos pela política de versão explícita nos arquivos de configuração.
Cada projeto. NET possui um arquivo AssemblyInfo que contém um atributo AssemblyVersion e um atributo AssemblyFileVersion.
AssemblyVersion: este é o número da versão usada pelo. NET framework durante a construção e no tempo de execução para localizar, vincular e carregar os assemblies. Quando você adiciona uma referência a qualquer montagem em seu projeto, é esse número de versão que é incorporado. No tempo de execução, o CLR procura por assembly com este número de versão para carregar. Mas lembre-se que esta versão é usada junto com o nome, token de chave pública e informações culturais somente se os conjuntos tiverem nomes fortes assinados. Se os assemblies não tiverem um nome forte assinado, somente os nomes de arquivo serão usados para o carregamento. AssemblyFileVersion: Este é o número da versão dado a um arquivo como no sistema de arquivos. É exibido pelo Windows Explorer. Nunca é usado pelo. NET framework ou por tempo de execução para referência.
Mas e essa diferença entre AssemblyVersion e AssemblyFileVersion? Muitas vezes, vejo que a mesma versão é aplicada a ambos os atributos & # 8230; mas por que esses dois (diferentes) atributos são fornecidos pelo. NET Framework? O AssemblyVersion deve ser a versão pública de um aplicativo de software inteiro, enquanto o AssemblyFileVersion é mais a versão de um componente específico que pode ser apenas uma pequena parte do aplicativo inteiro. O AssemblyFileVersion é o melhor local para colocar informações sobre a versão extra da compilação, o que pode ser importante para corrigir componentes individuais de um aplicativo de software.
Por favor, siga as recomendações de versão semântica para ditar como o AssemblyVersion deve ser atribuído e incrementado. Para o AssemblyFileVersion, tenho a tendência de incluir informações de compilação específicas. Muitas vezes, você precisará criar (e testar) um determinado número de vezes uma versão SemVer específica do seu software.
Por exemplo: o release 1 de um aplicativo de software pode ter o AssemblyVersion configurado como 1.0.0 (todos os componentes), enquanto o AssemblyFileVersion dos componentes individuais pode ser definido como 1.0.15234.2, que se refere a um número de build impróprio do sistema de compilação e é vinculada a uma data específica e a uma revisão: & # 8220; 15 & # 8221; = ano de 2015; & # 8220; 234 & # 8221; = número do dia em 2015; & # 8220; 2 & # 8221; = segunda compilação processada naquele dia. Isso também permite, posteriormente, corrigir componentes individuais em produção com um AssemblyVersion (1.0.0) semelhante, mas um AssemblyFileVersion diferente (1.0.15235.1).
Então, vamos tentar aplicar isso a um projeto de teste no Visual Studio e ver os detalhes da montagem depois de construir o projeto & # 8230;
Agora você deve estar confuso! Por que a versão do produto exibe o AssemblyFileVersion e onde está a AssemblyVersion? O problema aqui é que um novo projeto do Visual Studio não inclui um terceiro atributo de versão, AssemblyInformationalVersion, que deve representar a versão pública de todo o seu aplicativo de software. Note que o CLR não se preocupa com este terceiro (opcional) atributo de versão. Em suma, as mesmas regras de versionamento semântico de AssemblyVersion devem ser aplicadas à AssemblyInformationalVersion.
Ah! Isso parece muito melhor, certo? Agora também é fácil extrair esses metadados de seus assemblies implantados e essas informações podem ser bem listadas na caixa sobre do seu software. O único problema com esta abordagem é que o AssemblyFileVersion não inclui o patch & # 8220; & # 8221; number (Version Semântica) do AssemblyVersion, mas isso pode ser ignorado com o fato de que o AssemblyFileVersion será unue e pode ser vinculado a uma execução de construção não apropriada no sistema de compilação. Essa maneira de trabalhar é minha interpretação pessoal de como as versões podem ser aplicadas adequadamente em aplicativos de software complexos e não refletem as diretrizes oficiais da Microsoft. Meu objetivo aqui é conscientizar os desenvolvedores de software sobre os possíveis riscos de não ter uma estratégia de versionamento clara.
Agora, esqueça a configuração manual das informações de versão nos arquivos AssemblyInfo e nunca libere o software de uma compilação local do Visual Studio. Em um processo de criação otimizado, a geração de números de versão e construção indevidos é coordenada centralmente. Para uma solução de problemas e rastreabilidade eficazes, é imprescindível que os assemblies gerados sejam carimbados com um identificador não identificado que pode ser facilmente rastreado até um número de compilação do sistema.
Em um próximo post, vou falar sobre como você pode alcançar essa estratégia global de versão. NET com o novo sistema de compilação no TFS 2015.
Estratégia de versão. net
Esta questão já tem uma resposta aqui:
Eu estaria interessado em obter as opiniões da comunidade SO sobre a melhor estratégia de versionamento de aplicativos.
Como você acompanha o número da versão do seu aplicativo? Você tem uma definição formal do que cada número / personagem nessa versão representa?
O que os diferentes números / strings da versão do aplicativo significam para seu aplicativo?
Você usa algum sistema de atualização automatizado nos seus aplicativos (por exemplo, algo como o Sparkle) e quão bom ele está se comportando para você?
Você tem um procedimento de atualização separado para testadores beta ou testadores de pré-lançamento do seu aplicativo?
marcado como duplicado pelo mosquito, MichaelT, Kilian Foth, GlenH7, Rein Henrichs 29 de abril de 2013 em 2:42.
Esta pergunta foi feita antes e já tem uma resposta. Se essas respostas não responderem completamente à sua pergunta, faça uma nova pergunta.
migrou do stackoverflow 18 de maio de 11 às 13:48.
Esta pergunta veio do nosso site para programadores profissionais e entusiastas.
Como você acompanha o número da versão do seu aplicativo? Você tem uma definição formal do que cada número / personagem nessa versão representa?
O que os diferentes números / strings da versão do aplicativo significam para seu aplicativo?
Eu uso o seguinte:
Major - A versão principal é uma versão definitiva do produto. Aumentou quando há mudanças significativas na funcionalidade.
Menor - A versão secundária é incrementada quando apenas novos recursos ou grandes correções de erros foram adicionadas.
Upgrade / Patch - Upgrade refere-se à substituição de um produto por uma versão mais nova do produto. Ele é incrementado somente quando a atualização é fornecida no release principal designado. A versão em patch começa com 0 e é incrementada somente quando o bug é resolvido.
Build No - Build Number é incrementado quando uma nova compilação é criada.
Você usa algum sistema de atualização automatizado nos seus aplicativos (por exemplo, algo como o Sparkle) e quão bom ele está se comportando para você?
Usamos a ferramenta de construção que constrói automaticamente o aplicativo à noite, o que chamamos de construção noturna e isso aumenta o número de compilação sempre que uma construção é criada.
Você tem um procedimento de atualização separado para testadores beta ou testadores de pré-lançamento do seu aplicativo?
Não. Testes de testes durante a noite, a cada manhã, a que chamamos BAT (Build Acceptance Test, teste de aceitação de construção) e verificações noturnas.
Estratégia de versão. net
Estou interessado em ouvir as melhores práticas sobre como diferentes versões de serviços da web são manipuladas.
Para esclarecer, se você tem alguns métodos da web expostos como um serviço da web, então você deseja adicionar um recurso / funcionalidade e, assim, alterar a assinatura dessas chamadas de método, como você lida com isso de uma maneira que não quebra todos de seus clientes que atualmente ligam para o serviço?
Você implanta o serviço em um URL diferente?
Você coloca uma versão no próprio nome do método (MyMethod, MyMethodv2 etc. - ugh ..)
Você passa uma versão como parte da chamada do método junto com uma lista de parâmetros?
Alguém sabe como o Google ou a Amazon lidam com esse cenário com sua extensa biblioteca de serviços da Web?
EDIT: Até agora eu encontrei algumas boas informações neste artigo da Oracle. Também esta entrada de blog sobre alguns detalhes específicos de Java foi útil. Ainda estou curioso para ver algumas das outras abordagens.
A maneira típica de versionar um serviço da Web é fazer com que os clientes especifiquem a versão desejada. Você pode permitir restrições simples, como "> 2.0", "& lt; 1.5" ou "= 1.1". Naturalmente, você deseja minimizar o número de versões suportadas para sua própria sanidade. Se um cliente não especificar uma versão, você assume o mais recente.
As técnicas para fornecer a versão variam. Alguns defendem o uso da URL, outros incentivam cabeçalhos, alguns podem incluí-lo como um parâmetro da chamada da API. Quase nenhum mudaria o nome do método, no entanto. Isso é equivalente ao "pacote" ou "namespace" versionando o link OSGi. Isso tornará a atualização muito difícil e impedirá que as pessoas atualizem mais do que quaisquer alterações no serviço real.
Também depende de como você acessa seus serviços da web. Se você estiver usando REST, manter os cabeçalhos limpos e usando a URL faz mais sentido (e seria trivial inseri-la como um parâmetro de consulta, se necessário). Se você estiver usando SOAP / XMLRPC / whatever-RPC, então colocá-lo na URL geralmente é bom.
Como o cliente especifica a versão, geralmente é bem fácil. O que é mais complicado é como você executa todas as versões simultaneamente. A maioria das linguagens não tem como carregar várias versões da mesma biblioteca / módulo / classe / função no mesmo ambiente de tempo de execução (seja uma VM, processo ou o que você tem). O link OSGi que você forneceu é a solução do Java para permitir isso.
Na prática, o OSGi será um exagero para a maioria das situações. Geralmente, é mais fácil fazer proxy para pedidos reprovados em outro servidor ou processo.
A melhor maneira de "versionar" seus serviços, no entanto, é criar extensibilidade e flexibilidade neles, para que permaneçam compatíveis para frente e para trás. Isso não significa que todas as versões devem ser compatíveis entre si, mas versões consecutivas devem ser compatíveis entre si.
tente me pegar.
Estratégia de versionamento de montagem global & # 038; Fluxos de Trabalho de Desenvolvimento para Assemblies. NET.
Nas últimas semanas, tenho trabalhado em um novo projeto em nossa empresa, que envolveu a construção de várias montagens interdependentes, com forte ênfase na nomeação & # 8221; e instalá-los no Global Assembly Cache. No decorrer do projeto, fui forçado a analisar várias questões relacionadas a versões de montagem, organização de soluções e implantação de ambientes em um ambiente de desenvolvedor.
Então, dado que já faz um tempo desde que eu escrevi algo vagamente técnico, eu pensei em documentar alguns desses problemas.
Qual estratégia de numeração de versão devemos usar? Como vamos organizar nossa solução para tornar isso facilmente gerenciável? Como vamos gerenciar essas bibliotecas durante a fase de implantação? Como vamos distribuir versões estáveis para desenvolvedores durante o desenvolvimento contínuo de outros projetos? Como vamos liberar essas bibliotecas para os clientes?
Atributos de versão de montagem em assemblies. NET.
Antes de começarmos, provavelmente vale a pena gastar um pouco de tempo nas versões de montagem no. NET. O Microsoft. NET suporta 3 tipos diferentes de & # 8220; Version Number & # 8221; informações sobre uma Assembléia. As descrições abaixo são retiradas do MSDN.
Assembly Version; Â O número da versão da montagem faz parte da identidade de uma montagem e desempenha um papel fundamental na ligação à montagem e na política de versão. A política de versão padrão para o tempo de execução é que os aplicativos são executados apenas com as versões com as quais foram construídos e testados. (A menos que seja substituído na configuração). Versão do Arquivo de Montagem; Um número de versão específico para o recurso de versão do arquivo Win32. Não é necessário que a versão do arquivo Win32 seja igual ao número da versão do assembly, buf se não for fornecido, o AssemblyVersionAttribute é usado. Ele pode ser visto na guia Versão da caixa de diálogo de propriedades de arquivos do Windows. Versão informativa da montagem; Mais informações sobre a versão para um manifesto de assembly. Se o AssemblyInformationalVersionAttributeВ não é aplicado a um assembly, o número de versão especificado pelo Atributo de Version Attribute de Assembly é usado em vez disso.
Esses 3 atributos podem ser definidos em um assembly no arquivo $ Project \ Properties \ AssemblyInfo. cs.
Para o AssemblyVersionAttribute, temos a opção de substituir o padrão. . . formato, com qualquer um. . . * ou. . * que fará com que o compilador gere automaticamente os componentes de compilação e revisão. Se optarmos por usar os números de compilação e revisão automáticos, o número será padronizado para o número de dias desde 1º de janeiro de 2012. O número  será padronizado para o número de segundos desde a meia-noite, dividido por 2.
Criando uma chave de nome forte para suas montagens.
Para colocar um. NET Assembly no GAC, o assembly deve ser "Strongly Named & # 8221 ;. Um nome forte é um identificador para a montagem composto por: nome do texto simples, número da versão e informações sobre a cultura (se fornecidos) e uma chave pública e uma assinatura digital. Para nomear fortemente seu assembly, precisamos gerar uma chave Strong-Name. Isso pode ser feito de dentro do Visual Studio, mas isso fará com que a chave faça parte desse projeto específico. Minha preferência pessoal é gerar a chave externamente usando a ferramenta sn. exe. Isso torna um pouco mais fácil armazenar a chave em outro lugar e compartilhá-la entre outros projetos, como veremos abaixo.
Organização da Solução.
Então vamos começar a criar a solução. A solução de amostra está disponível aqui no GitHub, que mostra o produto final. Primeiro, criamos dois projetos de biblioteca de classes e fazemos um referência do outro. Também criamos os itens de solução & # 8220; & # 8221; pasta para armazenar itens comuns, como a nossa Strong Name Key e informações comuns de montagem.
Também atualizamos o caminho de saída para todas as configurações de montagem para apenas bin \. Isso facilita o gerenciamento das versões de Depuração / Liberação em scripts em lote pós-construção, já que apenas uma versão pode existir simultaneamente.
Bin \ Output comum.
Arquivo-chave de nome forte comum.
Em seguida, criamos nossa Strong Named Key. Para usar a mesma chave em cada um de nossos conjuntos, geramos externamente um arquivo snk usando o seguinte comando e o colocamos em uma pasta do Windows Explorer na solução.
Este arquivo é colocado na pasta de solução raiz no Windows Explorer e depois arrastado para a pasta de itens de solução dentro da solução. Finalmente, adicionamos este arquivo snk a cada projeto individual como um & # 8220; Linked & # 8221; Arquivo.
Adicionando uma chave com nome forte como um arquivo vinculado.
Uma vez que a chave nomeada forte é adicionada como um arquivo vinculado, configuramos o conjunto para ser assinado na compilação na tela de propriedades do projeto.
Assinando a Assembléia.
Common & # 8220; GlobalAssemblyInfo & # 8221; Arquivo.
Cada projeto vem com um arquivo de informações de montagem padrão em sua pasta de propriedades. Em soluções grandes, no entanto, manter todos esses arquivos de informações de montagem diferentes pode ser difícil, especialmente se houver atributos comuns que precisem ser compartilhados / sincronizados entre os diferentes projetos. Podemos conseguir isso adicionando um & # 8220; GlobalAssemblyInfo & # 8221; arquivo para a solução. Adicionando o arquivo para cada projeto é feito da mesma maneira que acima para snk. Criamos um GlobalAssemblyInfo. cs na pasta raiz da solução no Windows Explorer, adicionamos à pasta Itens da Solução dentro do SLN e, em seguida, adicionamos a cada projeto individual como um arquivo vinculado. Uma vez adicionado, pode ser arrastado sob a pasta Propriedades para manter as coisas organizadas.
O propósito de ter esses dois arquivos é que agora podemos dividir os diferentes atributos de assembly que são específicos de nossos projetos individuais, daqueles que queremos manter comuns em toda a solução. Na solução de amostra, os atributos foram divididos nos dois arquivos da seguinte maneira.
Estratégia de número de versão.
Ufa! Chegando lá e # 8230; Portanto, agora que a solução está organizada, precisamos decidir qual esquema / estratégia de numeração de versão usar para a versão de nossas Assemblies. Quais outras considerações precisam ser tomadas? Este é um assunto muito aberto e provavelmente dependerá de sua própria empresa ou situação. Você deve ter o seguinte em mente.
Tente e fique com o. . . mecanismo de versionamento. Não é necessário usar números de compilação e revisões de software, mas seguir um padrão de número geral / secundário menor ajudará sua equipe, os vendedores e os clientes a reconhecerem exatamente onde estão as escadas da versão do produto. Lembre-se de que alterar o número de AssemblyVersion significará ter que recompilar / relançar todos os outros aplicativos que fazem referência a esse assembly. Lembre-se que alterar o número da versão do arquivo de montagem não. Isso pode mudar livremente entre lançamentos.
Na minha empresa, usamos um esquema de numeração. . . como fazemos apenas construções trimestrais estáveis de nossos conjuntos principais. Nos meus projetos pessoais, uso um incremento padrão. esquema com corrente como a parte dos números de versão do Assembly e do AssemblyFile. E o padrão. Net de segundo atual no dia dividido por 2 para a revisão. Isso é facilmente obtido usando este script rápido de powershell.
O componente de revisão do AssemblyVersion é deixado de fora, mas na versão do arquivo de montagem ele está definido para a atual revisão de ChangeSet de controle de origem no momento da compilação. Finalmente, a Versão Informativa é configurada para uma descrição mais detalhada da versão atual de produção de software.
[note] Então por que todo esse problema?
Bem, esta é uma combinação muito poderosa de informação. Quando bloqueamos uma liberação e a distribuímos, o AssemblyVersion é confirmado como parte do nome forte da montagem e, uma vez instalado no GAC, quaisquer aplicativos compilados com relação a essa versão estão vinculados a essa AssemblyVersion.
Mas imagine que encontramos um bug. Ele não altera nenhum contrato ou método de interface, mas precisa ser corrigido com uma versão de hotfix. Não há problema, podemos reconstruir e relançar a montagem com a mesma AssemblyVersion, e os aplicativos continuarão a fazer referências felizes. Também podemos aumentar o AssemblyFileVersion para que possamos ver rapidamente qual versão específica está em vigor em um determinado site de implantação. Podemos visualizar a versão do arquivo e a versão informativa através da janela Propriedades do Windows Explorer. [/ Notice] Propriedades do assembly.
Fluxo de Trabalho de Desenvolvimento.
Agora que temos uma versão estável de nossas bibliotecas, temos algumas coisas a considerar relacionadas ao nosso processo de desenvolvimento e fluxo de trabalho do desenvolvedor. Vamos tomar cada um dos seguintes, um de cada vez.
Como pretendemos adicionar essas bibliotecas ao GAC, como podemos construir o & amp; depurá-los nesse mesmo contexto? Como vamos distribuir versões estáveis para outros desenvolvedores? Como vamos manter outros desenvolvedores no Sync?
Assemblies de Auto-GAC.
O Visual Studio vem com uma ferramenta SDK chamada GACUtil para adicionar Assemblies ao Cache Global de Assembly. É importante observar que o GACUtil não é um aplicativo redistribuível e NÃO deve ser usado para adicionar assemblies ao GAC em um ambiente de produção, mas em "Developer-land & # 8221; nós somos livres para alavancar isso. Após cada compilação, podemos colocar automaticamente cada montagem no cache global de assemblies usando um Comando Pós-Compilação no Projeto. (Projeto - & gt; Propriedades - & gt; Eventos de criação - & gt; Evento pós-construção)
Mesmo se instalarmos os assemblies a partir do & # 8220; Stable Build & # 8221; Repositório (sobre o qual falaremos a seguir), cada compilação subsequente da Solução VersioningDemo em nossa própria máquina substituirá essas referências e as substituirá em nosso GAC (desde que não tenhamos atualizado nosso Número AssemblyVersion).
O Repositório de Construções Estáveis.
Uma vez um & # 8220; válido & # 8221; das assembléias foram tomadas para distribuição (isto é, um branch ou tag estável ou qualquer que seja o processo interno), nós completaremos um build de release de nosso Application e então moveremos nossos assemblies para um & # 8220; Stable; Construções & # 8221; pasta dentro do nosso Sistema de Controle de Origem. A solução contém uma pasta chamada & # 8220; Estável & # 8221; sob a raiz da pasta de solução. Abaixo disso, um diretório é criado para cada compilação estável e nomeado com o número de versão do assembly dessa compilação.
Estrutura estável de pastas.
Para ajudar a gerenciar isso, podemos usar o seguinte arquivo em lote CopyToStable. bat, que envia os assemblies compilados mais recentes do diretório \ bin \ para uma pasta de versão estável especificada.
Mantendo Outros Desenvolvedores & # 8220; In-Sync & # 8221; via SVN.
Finalmente, precisamos circular essas bibliotecas para os outros desenvolvedores da equipe. Isso é feito verificando a pasta Stable no SVN. Temos um script svn de equipe de desenvolvedores que usamos para extrair a última revisão de cabeçote do tronco todas as manhãs (ou as ramificações relevantes em que um desenvolvedor pode estar trabalhando). Na parte inferior deste script, incluímos alguns comandos em lote adicionais para iterar automaticamente todas as subpastas abaixo de cada Diretório de Construção Estável e reinstalar automaticamente os assemblies no GAC. Considerações:
Desde & # 8220; Estável & # 8221; está comprometido na mesma estrutura de árvore que a solução em si, ramificando a solução também ramifica os Libs estáveis. Rodando o & # 8220; GetTrunk & # 8221; O script svn auto check-out e GACUtil as versões mais recentes dos Libertáveis estáveis de Tronco Executando um dos & # 8220; GetBranch & # 8221; Os scripts svn farão o check-out automático e o GACUtil as últimas versões desse ramo substituindo o que foi previamente instalado no GAC. Abrir e recompilar a Solução de Montagem do GAC localmente adicionará automaticamente os assemblies recém-compilados ao GAC, substituindo o que foi instalado anteriormente.
Então você tem isso. Minha solução atual para gerenciamento e controle de versão de assemblies de nome forte e GAC em um fluxo de trabalho de desenvolvimento. Se alguém tiver algum comentário, recomendações ou coisas diferentes, adoro saber sobre eles.
Estratégias de versionamento para os sãos.
Eu não sei porque eu não pensei nisso antes, faz muito sentido. Uma colega de trabalho compartilhou uma fantástica estratégia de versão de montagem que elimina todas as decisões sobre números de versão maiores / menores que temos que fazer.
Se eu não estiver enviando um assembly para um produto, a versão real de um assembly não importa por qualquer tipo de motivo de marketing. Para o AutoMapper, os números da versão indicam o nível de incremento de recursos e vemos isso com produtos como jQuery,.NET Framework etc.
No entanto, se estiver construindo algo em que ninguém se importe se a versão for 1.0 ou 2.0, poderemos incorporar um pouco mais de informações que podem realmente ser úteis para nós. Podemos marcar o assembly com um hash do changeset para determinar com exatidão de qual commit este assembly foi criado. Mas isso ainda nos deixa para fazer algo para a versão real da montagem. Mas meu amigo Glenn compartilhou essa estratégia brilhante: use um formato baseado inteiramente em datas, que sempre aumente, seja fácil de ler e entender, e nunca atinja qualquer tipo de exceção de estouro de dados:
Estou interessado em ouvir as melhores práticas sobre como diferentes versões de serviços da web são manipuladas.
Para esclarecer, se você tem alguns métodos da web expostos como um serviço da web, então você deseja adicionar um recurso / funcionalidade e, assim, alterar a assinatura dessas chamadas de método, como você lida com isso de uma maneira que não quebra todos de seus clientes que atualmente ligam para o serviço?
Você implanta o serviço em um URL diferente?
Você coloca uma versão no próprio nome do método (MyMethod, MyMethodv2 etc. - ugh ..)
Você passa uma versão como parte da chamada do método junto com uma lista de parâmetros?
Alguém sabe como o Google ou a Amazon lidam com esse cenário com sua extensa biblioteca de serviços da Web?
EDIT: Até agora eu encontrei algumas boas informações neste artigo da Oracle. Também esta entrada de blog sobre alguns detalhes específicos de Java foi útil. Ainda estou curioso para ver algumas das outras abordagens.
A maneira típica de versionar um serviço da Web é fazer com que os clientes especifiquem a versão desejada. Você pode permitir restrições simples, como "> 2.0", "& lt; 1.5" ou "= 1.1". Naturalmente, você deseja minimizar o número de versões suportadas para sua própria sanidade. Se um cliente não especificar uma versão, você assume o mais recente.
As técnicas para fornecer a versão variam. Alguns defendem o uso da URL, outros incentivam cabeçalhos, alguns podem incluí-lo como um parâmetro da chamada da API. Quase nenhum mudaria o nome do método, no entanto. Isso é equivalente ao "pacote" ou "namespace" versionando o link OSGi. Isso tornará a atualização muito difícil e impedirá que as pessoas atualizem mais do que quaisquer alterações no serviço real.
Também depende de como você acessa seus serviços da web. Se você estiver usando REST, manter os cabeçalhos limpos e usando a URL faz mais sentido (e seria trivial inseri-la como um parâmetro de consulta, se necessário). Se você estiver usando SOAP / XMLRPC / whatever-RPC, então colocá-lo na URL geralmente é bom.
Como o cliente especifica a versão, geralmente é bem fácil. O que é mais complicado é como você executa todas as versões simultaneamente. A maioria das linguagens não tem como carregar várias versões da mesma biblioteca / módulo / classe / função no mesmo ambiente de tempo de execução (seja uma VM, processo ou o que você tem). O link OSGi que você forneceu é a solução do Java para permitir isso.
Na prática, o OSGi será um exagero para a maioria das situações. Geralmente, é mais fácil fazer proxy para pedidos reprovados em outro servidor ou processo.
A melhor maneira de "versionar" seus serviços, no entanto, é criar extensibilidade e flexibilidade neles, para que permaneçam compatíveis para frente e para trás. Isso não significa que todas as versões devem ser compatíveis entre si, mas versões consecutivas devem ser compatíveis entre si.
tente me pegar.
Estratégia de versionamento de montagem global & # 038; Fluxos de Trabalho de Desenvolvimento para Assemblies. NET.
Nas últimas semanas, tenho trabalhado em um novo projeto em nossa empresa, que envolveu a construção de várias montagens interdependentes, com forte ênfase na nomeação & # 8221; e instalá-los no Global Assembly Cache. No decorrer do projeto, fui forçado a analisar várias questões relacionadas a versões de montagem, organização de soluções e implantação de ambientes em um ambiente de desenvolvedor.
Então, dado que já faz um tempo desde que eu escrevi algo vagamente técnico, eu pensei em documentar alguns desses problemas.
Qual estratégia de numeração de versão devemos usar? Como vamos organizar nossa solução para tornar isso facilmente gerenciável? Como vamos gerenciar essas bibliotecas durante a fase de implantação? Como vamos distribuir versões estáveis para desenvolvedores durante o desenvolvimento contínuo de outros projetos? Como vamos liberar essas bibliotecas para os clientes?
Atributos de versão de montagem em assemblies. NET.
Antes de começarmos, provavelmente vale a pena gastar um pouco de tempo nas versões de montagem no. NET. O Microsoft. NET suporta 3 tipos diferentes de & # 8220; Version Number & # 8221; informações sobre uma Assembléia. As descrições abaixo são retiradas do MSDN.
Assembly Version; Â O número da versão da montagem faz parte da identidade de uma montagem e desempenha um papel fundamental na ligação à montagem e na política de versão. A política de versão padrão para o tempo de execução é que os aplicativos são executados apenas com as versões com as quais foram construídos e testados. (A menos que seja substituído na configuração). Versão do Arquivo de Montagem; Um número de versão específico para o recurso de versão do arquivo Win32. Não é necessário que a versão do arquivo Win32 seja igual ao número da versão do assembly, buf se não for fornecido, o AssemblyVersionAttribute é usado. Ele pode ser visto na guia Versão da caixa de diálogo de propriedades de arquivos do Windows. Versão informativa da montagem; Mais informações sobre a versão para um manifesto de assembly. Se o AssemblyInformationalVersionAttributeВ não é aplicado a um assembly, o número de versão especificado pelo Atributo de Version Attribute de Assembly é usado em vez disso.
Esses 3 atributos podem ser definidos em um assembly no arquivo $ Project \ Properties \ AssemblyInfo. cs.
Para o AssemblyVersionAttribute, temos a opção de substituir o padrão. . . formato, com qualquer um. . . * ou. . * que fará com que o compilador gere automaticamente os componentes de compilação e revisão. Se optarmos por usar os números de compilação e revisão automáticos, o número será padronizado para o número de dias desde 1º de janeiro de 2012. O número  será padronizado para o número de segundos desde a meia-noite, dividido por 2.
Criando uma chave de nome forte para suas montagens.
Para colocar um. NET Assembly no GAC, o assembly deve ser "Strongly Named & # 8221 ;. Um nome forte é um identificador para a montagem composto por: nome do texto simples, número da versão e informações sobre a cultura (se fornecidos) e uma chave pública e uma assinatura digital. Para nomear fortemente seu assembly, precisamos gerar uma chave Strong-Name. Isso pode ser feito de dentro do Visual Studio, mas isso fará com que a chave faça parte desse projeto específico. Minha preferência pessoal é gerar a chave externamente usando a ferramenta sn. exe. Isso torna um pouco mais fácil armazenar a chave em outro lugar e compartilhá-la entre outros projetos, como veremos abaixo.
Organização da Solução.
Então vamos começar a criar a solução. A solução de amostra está disponível aqui no GitHub, que mostra o produto final. Primeiro, criamos dois projetos de biblioteca de classes e fazemos um referência do outro. Também criamos os itens de solução & # 8220; & # 8221; pasta para armazenar itens comuns, como a nossa Strong Name Key e informações comuns de montagem.
Também atualizamos o caminho de saída para todas as configurações de montagem para apenas bin \. Isso facilita o gerenciamento das versões de Depuração / Liberação em scripts em lote pós-construção, já que apenas uma versão pode existir simultaneamente.
Bin \ Output comum.
Arquivo-chave de nome forte comum.
Em seguida, criamos nossa Strong Named Key. Para usar a mesma chave em cada um de nossos conjuntos, geramos externamente um arquivo snk usando o seguinte comando e o colocamos em uma pasta do Windows Explorer na solução.
Este arquivo é colocado na pasta de solução raiz no Windows Explorer e depois arrastado para a pasta de itens de solução dentro da solução. Finalmente, adicionamos este arquivo snk a cada projeto individual como um & # 8220; Linked & # 8221; Arquivo.
Adicionando uma chave com nome forte como um arquivo vinculado.
Uma vez que a chave nomeada forte é adicionada como um arquivo vinculado, configuramos o conjunto para ser assinado na compilação na tela de propriedades do projeto.
Assinando a Assembléia.
Common & # 8220; GlobalAssemblyInfo & # 8221; Arquivo.
Cada projeto vem com um arquivo de informações de montagem padrão em sua pasta de propriedades. Em soluções grandes, no entanto, manter todos esses arquivos de informações de montagem diferentes pode ser difícil, especialmente se houver atributos comuns que precisem ser compartilhados / sincronizados entre os diferentes projetos. Podemos conseguir isso adicionando um & # 8220; GlobalAssemblyInfo & # 8221; arquivo para a solução. Adicionando o arquivo para cada projeto é feito da mesma maneira que acima para snk. Criamos um GlobalAssemblyInfo. cs na pasta raiz da solução no Windows Explorer, adicionamos à pasta Itens da Solução dentro do SLN e, em seguida, adicionamos a cada projeto individual como um arquivo vinculado. Uma vez adicionado, pode ser arrastado sob a pasta Propriedades para manter as coisas organizadas.
O propósito de ter esses dois arquivos é que agora podemos dividir os diferentes atributos de assembly que são específicos de nossos projetos individuais, daqueles que queremos manter comuns em toda a solução. Na solução de amostra, os atributos foram divididos nos dois arquivos da seguinte maneira.
Estratégia de número de versão.
Ufa! Chegando lá e # 8230; Portanto, agora que a solução está organizada, precisamos decidir qual esquema / estratégia de numeração de versão usar para a versão de nossas Assemblies. Quais outras considerações precisam ser tomadas? Este é um assunto muito aberto e provavelmente dependerá de sua própria empresa ou situação. Você deve ter o seguinte em mente.
Tente e fique com o. . . mecanismo de versionamento. Não é necessário usar números de compilação e revisões de software, mas seguir um padrão de número geral / secundário menor ajudará sua equipe, os vendedores e os clientes a reconhecerem exatamente onde estão as escadas da versão do produto. Lembre-se de que alterar o número de AssemblyVersion significará ter que recompilar / relançar todos os outros aplicativos que fazem referência a esse assembly. Lembre-se que alterar o número da versão do arquivo de montagem não. Isso pode mudar livremente entre lançamentos.
Na minha empresa, usamos um esquema de numeração. . . como fazemos apenas construções trimestrais estáveis de nossos conjuntos principais. Nos meus projetos pessoais, uso um incremento padrão. esquema com corrente como a parte dos números de versão do Assembly e do AssemblyFile. E o padrão. Net de segundo atual no dia dividido por 2 para a revisão. Isso é facilmente obtido usando este script rápido de powershell.
O componente de revisão do AssemblyVersion é deixado de fora, mas na versão do arquivo de montagem ele está definido para a atual revisão de ChangeSet de controle de origem no momento da compilação. Finalmente, a Versão Informativa é configurada para uma descrição mais detalhada da versão atual de produção de software.
[note] Então por que todo esse problema?
Bem, esta é uma combinação muito poderosa de informação. Quando bloqueamos uma liberação e a distribuímos, o AssemblyVersion é confirmado como parte do nome forte da montagem e, uma vez instalado no GAC, quaisquer aplicativos compilados com relação a essa versão estão vinculados a essa AssemblyVersion.
Mas imagine que encontramos um bug. Ele não altera nenhum contrato ou método de interface, mas precisa ser corrigido com uma versão de hotfix. Não há problema, podemos reconstruir e relançar a montagem com a mesma AssemblyVersion, e os aplicativos continuarão a fazer referências felizes. Também podemos aumentar o AssemblyFileVersion para que possamos ver rapidamente qual versão específica está em vigor em um determinado site de implantação. Podemos visualizar a versão do arquivo e a versão informativa através da janela Propriedades do Windows Explorer. [/ Notice] Propriedades do assembly.
Fluxo de Trabalho de Desenvolvimento.
Agora que temos uma versão estável de nossas bibliotecas, temos algumas coisas a considerar relacionadas ao nosso processo de desenvolvimento e fluxo de trabalho do desenvolvedor. Vamos tomar cada um dos seguintes, um de cada vez.
Como pretendemos adicionar essas bibliotecas ao GAC, como podemos construir o & amp; depurá-los nesse mesmo contexto? Como vamos distribuir versões estáveis para outros desenvolvedores? Como vamos manter outros desenvolvedores no Sync?
Assemblies de Auto-GAC.
O Visual Studio vem com uma ferramenta SDK chamada GACUtil para adicionar Assemblies ao Cache Global de Assembly. É importante observar que o GACUtil não é um aplicativo redistribuível e NÃO deve ser usado para adicionar assemblies ao GAC em um ambiente de produção, mas em "Developer-land & # 8221; nós somos livres para alavancar isso. Após cada compilação, podemos colocar automaticamente cada montagem no cache global de assemblies usando um Comando Pós-Compilação no Projeto. (Projeto - & gt; Propriedades - & gt; Eventos de criação - & gt; Evento pós-construção)
Mesmo se instalarmos os assemblies a partir do & # 8220; Stable Build & # 8221; Repositório (sobre o qual falaremos a seguir), cada compilação subsequente da Solução VersioningDemo em nossa própria máquina substituirá essas referências e as substituirá em nosso GAC (desde que não tenhamos atualizado nosso Número AssemblyVersion).
O Repositório de Construções Estáveis.
Uma vez um & # 8220; válido & # 8221; das assembléias foram tomadas para distribuição (isto é, um branch ou tag estável ou qualquer que seja o processo interno), nós completaremos um build de release de nosso Application e então moveremos nossos assemblies para um & # 8220; Stable; Construções & # 8221; pasta dentro do nosso Sistema de Controle de Origem. A solução contém uma pasta chamada & # 8220; Estável & # 8221; sob a raiz da pasta de solução. Abaixo disso, um diretório é criado para cada compilação estável e nomeado com o número de versão do assembly dessa compilação.
Estrutura estável de pastas.
Para ajudar a gerenciar isso, podemos usar o seguinte arquivo em lote CopyToStable. bat, que envia os assemblies compilados mais recentes do diretório \ bin \ para uma pasta de versão estável especificada.
Mantendo Outros Desenvolvedores & # 8220; In-Sync & # 8221; via SVN.
Finalmente, precisamos circular essas bibliotecas para os outros desenvolvedores da equipe. Isso é feito verificando a pasta Stable no SVN. Temos um script svn de equipe de desenvolvedores que usamos para extrair a última revisão de cabeçote do tronco todas as manhãs (ou as ramificações relevantes em que um desenvolvedor pode estar trabalhando). Na parte inferior deste script, incluímos alguns comandos em lote adicionais para iterar automaticamente todas as subpastas abaixo de cada Diretório de Construção Estável e reinstalar automaticamente os assemblies no GAC. Considerações:
Desde & # 8220; Estável & # 8221; está comprometido na mesma estrutura de árvore que a solução em si, ramificando a solução também ramifica os Libs estáveis. Rodando o & # 8220; GetTrunk & # 8221; O script svn auto check-out e GACUtil as versões mais recentes dos Libertáveis estáveis de Tronco Executando um dos & # 8220; GetBranch & # 8221; Os scripts svn farão o check-out automático e o GACUtil as últimas versões desse ramo substituindo o que foi previamente instalado no GAC. Abrir e recompilar a Solução de Montagem do GAC localmente adicionará automaticamente os assemblies recém-compilados ao GAC, substituindo o que foi instalado anteriormente.
Então você tem isso. Minha solução atual para gerenciamento e controle de versão de assemblies de nome forte e GAC em um fluxo de trabalho de desenvolvimento. Se alguém tiver algum comentário, recomendações ou coisas diferentes, adoro saber sobre eles.
Estratégias de versionamento para os sãos.
Eu não sei porque eu não pensei nisso antes, faz muito sentido. Uma colega de trabalho compartilhou uma fantástica estratégia de versão de montagem que elimina todas as decisões sobre números de versão maiores / menores que temos que fazer.
Se eu não estiver enviando um assembly para um produto, a versão real de um assembly não importa por qualquer tipo de motivo de marketing. Para o AutoMapper, os números da versão indicam o nível de incremento de recursos e vemos isso com produtos como jQuery,.NET Framework etc.
No entanto, se estiver construindo algo em que ninguém se importe se a versão for 1.0 ou 2.0, poderemos incorporar um pouco mais de informações que podem realmente ser úteis para nós. Podemos marcar o assembly com um hash do changeset para determinar com exatidão de qual commit este assembly foi criado. Mas isso ainda nos deixa para fazer algo para a versão real da montagem. Mas meu amigo Glenn compartilhou essa estratégia brilhante: use um formato baseado inteiramente em datas, que sempre aumente, seja fácil de ler e entender, e nunca atinja qualquer tipo de exceção de estouro de dados:
Комментарии
Отправить комментарий