Equivalente a AssemblyInfo no dotnet core / csproj

236

Desde que o núcleo do dotnet voltou ao .csprojformato, há um novo gerado automaticamente MyProject.AssemblyInfo.csque contém entre outros.

[assembly: AssemblyCompany("MyProject")]
[assembly: AssemblyVersion("1.0.0.0")]

Observe que isso é regenerado automaticamente a cada compilação. Anteriormente, o arquivo foi encontrado no diretório / obj /, agora parece estar apenas na memória, pois o arquivo não pode ser encontrado no disco e clicar na mensagem de erro não abre nenhum arquivo.

Esta é a mensagem de erro: insira a descrição da imagem aqui

Como eles são definidos lá, não posso defini-los eu mesmo no clássico AssemblyInfo.cs.

Onde / como posso definir a empresa e a versão de um projeto?

hultqvist
fonte
5
Observe que isso não está estritamente relacionado ao núcleo do dotnet. Isso está relacionado ao novo formato baseado em .csproj. É perfeitamente possível usar este novo formato .csproj com alvo o velho .NET Framework, por exemplo net461
Jim Aho

Respostas:

334

Como você já notou, é possível controlar a maioria dessas configurações no .csproj.

Se preferir mantê-los em AssemblyInfo.cs, você pode desativar os atributos de montagem gerados automaticamente.

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

Se você quiser ver o que está acontecendo, confira Microsoft.NET.GenerateAssemblyInfo.targets dentro do Microsoft.NET.Sdk.

natemcmaster
fonte
41
Fico feliz em ver que posso desligar isso. Me chame de antiquado, mas eu prefiro o bom e velho arquivo AssemblyInfo.cs do que o material gerado automaticamente de .netcore. Além disso, uso ferramentas externas para gerenciar minhas versões e o conteúdo das outras entradas do AssembyInfo. Tentei usar um destino personalizado para manter minhas propriedades fora do projeto em si, mas isso me deixou sufocado por um tempo.
Ivaylo Slavov
1
O mesmo aqui. Com o novo sistema baseado em csproj, não pude usar minhas ferramentas herdadas. Com esta propriedade, agora posso voltar, o que eu amo!
precisa saber é o seguinte
5
O NuGet não lê AssemblyInfo.cs. Você ainda precisa usar as propriedades do MSBuild para definir a versão do pacote NuGet.
Natemcmaster
6
quando o arquivo é gerado automaticamente, como definir o atributo InternalsVisibleTo no novo formato csproj?
Shubhan
8
@Shubhan, este não é um dos atributos gerados automaticamente. Criar um em algum lugar ficheiro.cs vazio em seu projeto e adicione o código InternalsVisibleTo a ele
natemcmaster
128

Essas configurações foram movidas para o arquivo .csproj.

Por padrão, eles não aparecem, mas você pode descobri-los no Visual Studio 2017 na Packageguia de propriedades do projeto .

Propriedades do projeto, guia Pacote

Uma vez salvos, esses valores podem ser encontrados em MyProject.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
    <Version>1.2.3.4</Version>
    <Authors>Author 1</Authors>
    <Company>Company XYZ</Company>
    <Product>Product 2</Product>
    <PackageId>MyApp</PackageId>
    <AssemblyVersion>2.0.0.0</AssemblyVersion>
    <FileVersion>3.0.0.0</FileVersion>
    <NeutralLanguage>en</NeutralLanguage>
    <Description>Description here</Description>
    <Copyright>Copyright</Copyright>
    <PackageLicenseUrl>License URL</PackageLicenseUrl>
    <PackageProjectUrl>Project URL</PackageProjectUrl>
    <PackageIconUrl>Icon URL</PackageIconUrl>
    <RepositoryUrl>Repo URL</RepositoryUrl>
    <RepositoryType>Repo type</RepositoryType>
    <PackageTags>Tags</PackageTags>
    <PackageReleaseNotes>Release</PackageReleaseNotes>
  </PropertyGroup>

Na guia de informações das propriedades do explorador de arquivos, FileVersioné mostrada como "Versão do arquivo" e Versioné mostrada como "Versão do produto"

hultqvist
fonte
1
As configurações nas propriedades do projeto parecem estar ausentes se meu tipo de projeto for Class Library (.NET Standard). Tens alguma ideia do porquê? Estou usando a versão 15.1, versão 26403.7, Community Edition.
ventiseis
2
Estou usando a Biblioteca de classes (.NET Standard) e a vejo na guia Pacotes. Você vê isso aí? Depois de "Salvar" algo diferente dos padrões, ele será exibido no csproj.
Tfutim
3
Como você usa um curinga como 1.0. *. * Ao usar a guia packages?
Soenhay 26/09/18
@Senhaenha, o curinga não faz muito sentido ao definir a versão do pacote, apenas ao consumi-la.
Paul Hatcher
@Soenhay meu entendimento é que você não pode, a menos que você use recurso semelhante em ferramentas de terceiros.
precisa saber é o seguinte
115

Eu faço o seguinte para meus projetos do .NET Standard 2.0.

Crie um Directory.Build.propsarquivo (por exemplo, na raiz do seu repositório) e mova as propriedades a serem compartilhadas do .csprojarquivo para esse arquivo.

O MSBuild irá buscá-lo automaticamente e aplicá-los à geração automática AssemblyInfo.cs.

Eles também são aplicados ao pacote nuget ao criar um com dotnet packou via interface do usuário no Visual Studio 2017.

Consulte https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

pfx
fonte
12
Isso deve conseguir mais upvotes, agradável para permitir que gerou o auto, mas ainda compartilhar algumas coisas ao longo de uma solução
Dan
@ Dan concordou, isso é tão longe abaixo das outras respostas que eu suspeito que a maioria das pessoas simplesmente não acaba lendo isso.
Lunyx
1
@ Justin, você não os verá nos arquivos do seu projeto; eles são aplicados nos conjuntos construídos resultantes.
pfx
1
E aqueles de nós que não usam o msbuild?
Joe Phillips
1
Essa foi uma ótima resposta. Obrigado. Usamos em nossa grande solução que produz alguns pacotes NuGet e essa é uma ótima alternativa para as informações de montagem antigas para novos projetos no estilo sdk
David Anderson
57

Você sempre pode adicionar seus próprios AssemblyInfo.cs , que vem em para acessível InternalsVisibleToAttribute, CLSCompliantAttributee outros que não são gerados automaticamente.

Adicionando AssemblyInfo.cs a um projeto

  1. No Solution Explorer, clique com o botão direito do mouse em <project name> > Add > New Folder.

Adicionar nova pasta

  1. Nomeie a pasta "Propriedades".

Pasta de nome Propriedades

  1. Clique com o botão direito do mouse na pasta "Propriedades" e clique em Add > New Item....

Adicionar novo item

  1. Selecione "Classe" e chame-o de "AssemblyInfo.cs".

Arquivo de nome AssemblyInfo.cs

Suprimindo atributos gerados automaticamente

Se você deseja mover seus atributos de volta para AssemblyInfo.cs em vez de gerá-los automaticamente, é possível suprimi-los no MSBuild como natemcmaster apontou em sua resposta .

NightOwl888
fonte
1
Obrigado NightOwl888, esta é a resposta que estou procurando.
Juniuz
3
Gostaria de evitar assumir toda a gente tem Visual Studio estes dias, há outros editores que poderiam ser usados fazer esta resposta difícil de seguir para alguns (por exemplo, eu estou fazendo isso em um Mac / Mono usando JetBrains Rider)
PandaWood
Às vezes, os novos líderes da Microsoft devem considerar manter o que funciona bem com o AssemblyInfo.cs, para que as compilações automatizadas ainda possam funcionar para modificar os números da compilação.
justdan23 24/06
6

Adicionando à resposta do NightOwl888, você pode dar um passo adiante e adicionar uma AssemblyInfoclasse em vez de apenas uma classe simples:

insira a descrição da imagem aqui

datchung
fonte
5
Não há "Arquivo de informações de montagem" quando abro esta caixa de diálogo no VS2019 para um projeto de rede 1.1.
SwissCoder 26/09/19
Obrigado por postar isso! Estou usando o .NET Core 3.1 e estava lá! Ele adiciona todas as principais partes padrão.
justdan23 24/06
6

Quero estender este tópico / respostas com o seguinte. Como alguém mencionado, este AssemblyInfo gerado automaticamente pode ser um obstáculo para as ferramentas externas. No meu caso, usando o FinalBuilder , tive um problema que o AssemblyInfo não estava sendo atualizado pela ação de compilação. Aparentemente, o FinalBuilder depende do ~projarquivo para encontrar a localização do AssemblyInfo . Eu pensei, estava procurando em qualquer lugar na pasta do projeto. Não. Então, mudar isso

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

fez apenas metade da tarefa, permitiu informações personalizadas de montagem, se construídas pelo VS IDE / MS Build. Mas eu precisava do FinalBuilder também sem manipulações manuais para o arquivo de informações de montagem. Eu precisava satisfazer todos os programas, MSBuild / VS e FinalBuilder.

Eu resolvi isso adicionando uma entrada à existente ItemGroup

<ItemGroup>
   <Compile Remove="Common\**" />
   <Content Remove="Common\**" />
   <EmbeddedResource Remove="Common\**" />
   <None Remove="Common\**" />
   <!-- new added item -->
   <None Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

Agora, com esse item, o FinalBuilder localiza o local do AssemblyInfo e modifica o arquivo. Embora a ação Nonepermita que o MSBuild / DevEnv ignore essa entrada e não reporte mais um erro com base na Compileação que geralmente acompanha a entrada Informações sobre a montagem nos projarquivos.

C: \ Arquivos de programas \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets (263,5): erro: itens 'Compilar' duplicados foram incluídos. O .NET SDK inclui itens de 'Compilação' do diretório do projeto por padrão. Você pode remover esses itens do arquivo do projeto ou definir a propriedade 'EnableDefaultCompileItems' como 'false' se desejar incluí-los explicitamente no arquivo do projeto. Para mais informações, consulte https://aka.ms/sdkimplicitititems . Os itens duplicados foram: 'AssemblyInfo.cs'

TS
fonte