Pergunta

Eu tenho uma solução com vários projetos.Estou tentando otimizar arquivos AssemblyInfo.cs vinculando um arquivo de informações de montagem de toda a solução.Quais são as melhores práticas para fazer isso?Quais atributos devem estar no arquivo de toda a solução e quais são específicos do projeto/montagem?


Editar:Se você estiver interessado, há uma pergunta de acompanhamento Quais são as diferenças entre AssemblyVersion, AssemblyFileVersion e AssemblyInformationalVersion?

Foi útil?

Solução

Estamos usando um arquivo global chamado GlobalAssemblyInfo.cs e um local chamado AssemblyInfo.cs.O arquivo global contém os seguintes atributos:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

O AssemblyInfo.cs local contém os seguintes atributos:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

Você pode adicionar GlobalAssemblyInfo.cs usando o seguinte procedimento:

  • Selecione Adicionar/item existente... no menu de contexto do projeto
  • Selecione GlobalAssemblyInfo.cs
  • Expanda o botão Adicionar clicando na pequena seta para baixo à direita
  • Selecione "Adicionar como link" na lista suspensa de botões

Outras dicas

No meu caso, estamos construindo um produto para o qual temos uma solução Visual Studio, com diversos componentes em projetos próprios.Os atributos comuns vão.Na solução, existem cerca de 35 projetos e uma informação de montagem comum (CommonAssemblyInfo.cs), que possui os seguintes atributos:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

Os outros atributos, como AssemblyTitle, AssemblyVersion etc, são fornecidos por assembly.Ao criar um assembly, tanto AssemblyInfo.cs quanto CommonAssemblyInfo.cs são integrados em cada assembly.Isso nos dá o melhor dos dois mundos, onde você pode querer ter alguns atributos comuns para todos os projetos e valores específicos para alguns outros.

Espero que ajude.

A solução apresentada por @JRoppert é quase igual à minha.A única diferença é que coloquei as seguintes linhas no arquivo AssemblyInfo.cs local, pois elas podem variar de acordo com cada assembly:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

Eu também (geralmente) uso uma informação de montagem comum por solução, com a suposição de que uma solução é uma única linha de produtos/produto liberável.O arquivo de informações de montagem comum também possui:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

O que definirá o valor "ProductVersion" exibido pelo Windows Explorer.

Tarefas da comunidade MSBuild contém uma tarefa personalizada chamada AssemblyInfo que você pode usar para gerar seu assemblyinfo.cs.Requer um pouco de edição manual dos arquivos csproj para usar, mas vale a pena.

Na minha opinião, usar um GlobalAssemblyInfo.cs é mais problemático do que vale a pena, porque você precisa modificar cada arquivo de projeto e lembrar de modificar cada novo projeto, enquanto você obtém um AssemblyInfo.cs por padrão.

Para alterações nos valores globais (ou seja,Empresa, Produto, etc.) as mudanças geralmente são tão raras e simples de gerenciar que não acho SECO deveria ser uma consideração.Basta executar o seguinte script MSBuild (dependendo do Pacote de extensão MSBuild) quando desejar alterar manualmente os valores em todos os projetos de forma única:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

Para compartilhar um arquivo entre vários projetos você pode adicionar um arquivo existente como link.

Para fazer isso, adicione um arquivo existente e clique em “Adicionar como link” no seletor de arquivos.Add As Link
(fonte: grátis.fr)

Quanto ao que colocar no arquivo compartilhado, sugiro colocar coisas que seriam compartilhadas entre assemblies.Coisas como direitos autorais, empresa, talvez versão.

Não é recomendado usar um único arquivo AseemblyInfo.cs para vários projetos.O arquivo AssemblyInfo inclui informações que podem ser relevantes apenas para aquela montagem específica.As duas informações mais óbvias são as AssemblyTitle e AssemblyVersion.

Uma solução melhor pode ser usar targets arquivo, que são manipulados pelo MSBuild, para "injetar" atributos de montagem em mais de um projeto.

Uma coisa que achei útil é gerar os elementos AssemblyVersion (etc) aplicando a substituição de token na fase de pré-construção.

Eu uso o TortoiseSvn e é fácil usar seu SubWCRev.exe transformar um modelo AssemblyInfo.wcrev em AssemblyInfo.cs.A linha relevante no modelo pode ser semelhante a esta:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

O terceiro elemento é então o número da revisão.Eu uso o quarto elemento para verificar se não esqueci de enviar nenhum arquivo novo ou alterado (o quarto elemento é 00 se estiver tudo bem).

A propósito, adicione AssemblyInfo.wcrev ao seu controle de versão e ignorar AssemblyInfo.cs se você usar isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top