Passei a maior parte de algumas horas tentando encontrar uma maneira de incrementar automaticamente as versões em um .NETCoreApp 1.1 (Visual Studio 2017).
Eu sei que o AssemblyInfo.cs está sendo criado dinamicamente na pasta: obj/Debug/netcoreapp1.1/
Não aceita o antigo método de:
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.*")]
Se eu definir o projeto para o pacote, posso definir as versões lá, mas isso parece ser usado para construir o arquivo AssemblyInfo.cs.
Minha pergunta é, alguém descobriu como controlar a versão em projetos do .NET Core (ou .NETStandard para esse assunto).
/p:
bandeira paradotnet msbuild
em seu script de construção e definir versão, empresa, direitos autorais ... todas essas coisas boas.<Deterministic>False</Deterministic>
no csproj para usá-lo. (ou use qualquer outra lógica MSbuild para calcular<VersionPrefix>
/<Version>
)Respostas:
Estou procurando um incrementador de versão para um aplicativo Net Core no VS2017 usando o formato de configuração csproj.
Encontrei um projeto chamado dotnet bump que funcionou para o formato project.json, mas teve dificuldade para encontrar uma solução para o formato .csproj. O escritor do dotnet bump realmente veio com a solução para o formato .csproj, que se chama MSBump.
Há um projeto no GitHub para isso em:
https://github.com/BalassaMarton/MSBump
onde você pode ver o código e também está disponível no Nuget. Basta pesquisar MSBump no Nuget.
fonte
Adicionar
<Deterministic>False</Deterministic>
dentro de uma<PropertyGroup>
seção de .csprojA solução alternativa para fazer o AssemblyVersion * funcionar é descrita em “Mensagem de erro confusa para curinga em [AssemblyVersion] no .Net Core # 22660”
As razões pelas quais os desenvolvedores .Net Core consideram as compilações determinísticas benéficas descritas em http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html e os compiladores devem ser determinísticas: as mesmas entradas geram as mesmas saídas # 372
No entanto, se você estiver usando TeamCity, TFS ou outra ferramenta de CI / CD, é provavelmente melhor manter o número da versão controlado e incrementado por eles e passar a construir como um parâmetro (como foi sugerido em outras respostas), por exemplo
Número do pacote para pacotes NuGet
fonte
Se estiver usando o Visual Studio Team Services / TFS ou algum outro processo de construção de CI para ter controle de versão integrado, você pode utilizar o
Condition
atributo msbuild , por exemplo:Isso dirá ao compilador do .NET Core para usar o que quer que esteja na
BUILD_BUILDNUMBER
variável de ambiente, se estiver presente, ou fallback para0.0.1-local
se você estiver fazendo uma compilação em sua máquina local.fonte
Eu vim com uma solução que funcionava quase da mesma forma que o antigo atributo AssemblyVersion com estrela (*) - AssemblyVersion ("1.0. ") *
Os valores para AssemblyVersion e AssemblyFileVersion estão no arquivo .csproj do projeto MSBuild (não em AssemblyInfo.cs ) como propriedade FileVersion (gera AssemblyFileVersionAttribute ) e AssemblyVersion (gera AssemblyVersionAttribute ). No processo MSBuild, usamos nossa tarefa MSBuild personalizada para gerar números de versão e, em seguida, substituímos os valores dessas propriedades FileVersion e AssemblyVersion por novos valores da tarefa.
Portanto, primeiro criamos nossa tarefa MSBuild personalizada GetCurrentBuildVersion :
Tarefa classe herde de Microsoft.Build.Utilities.Task classe de Microsoft.Build.Utilities.Core pacote NuGet. Ele recebe a propriedade BaseVersion (opcional) na entrada e retorna a versão gerada na propriedade de saída da Versão. A lógica para obter os números de versão é a mesma do controle de versão automático do .NET (o número da compilação é a contagem de dias desde 01/01/2000 e a revisão é de meio segundo desde a meia-noite).
Para construir esta tarefa MSBuild, usamos o tipo de projeto de biblioteca de classes .NET Standard 1.3 com esta classe.
O arquivo .csproj pode ter a seguinte aparência:
Este projeto de tarefa também está disponível em meu GitHub holajan / DC.Build.Tasks
Agora configuramos o MSBuild para usar esta tarefa e definir FileVersion propriedades e AssemblyVersion . No arquivo .csproj, tem a seguinte aparência:
Coisas importantes aqui:
A vantagem dessa solução é que ela funciona não apenas em compilações no servidor de compilação, mas também em compilações manuais de compilação dotnet ou Visual Studio.
fonte
DateTime.UtcNow
vez deDateTime.Now
no métodoGetCurrentBuildVersionString()
em particular se o código for executado em máquinas de construção automatizadas. Eles podem funcionar às 2h ou 3h da manhã, quando o computador muda de / para o horário de verão. ComDateTime.Now
nesse cenário que você pode estar indo para trás em termos de versão. Reconheço que este é um caso esquivo e também admito que sou exigente. :-) Além disso, o problema também desaparece se você configurar o mesmo fuso horário em todas as máquinas de construção e não ajustar para o horário de verão.Você pode usar uma função de propriedade MSBuild para definir o sufixo da versão com base na data atual:
Isso irá gerar um pacote com um nome como: PackageName.1.0.0-pre20180807-1711.nupkg .
Mais detalhes sobre as funções de propriedade do MSBuild: https://docs.microsoft.com/en-us/visualstudio/msbuild/property-functions
O
Version
é formado pela combinação deVersionPrefix
eVersionSuffix
, ou seVersionSuffix
estiver em branco,VersionPrefix
apenas.fonte
Aceitei a resposta acima porque @Gigi está correto (no momento), mas fiquei chateado e criei os scripts do PowerShell a seguir.
Primeiro, tenho o script na minha pasta de solução (UpdateBuildVersion.ps1):
Eu adicionei isso ao arquivo csproj:
Mesmo sendo definido como um PreBuildEvent, o fato é que os números da versão não são atualizados até DEPOIS que o arquivo foi carregado na memória, portanto, o número da versão não refletirá até a próxima compilação. Na verdade, você poderia alterá-lo para PostBuildEvent e teria o mesmo efeito.
Também criei os dois scripts a seguir: (UpdateMinorVersion.ps1)
(UpdateMajorVersion.ps1)
fonte
dotnet build /p:AssemblyVersion=1.2.3.4
Eu estava respondendo a: "Alguém descobriu como controlar a versão em projetos do .NET Core (ou .NETStandard para esse assunto)." Eu encontrei essa pergunta tentando resolver esse problema no contexto de um build de CI. Eu queria definir a versão do assembly para o número de compilação do CI.
fonte
Esses valores agora são definidos no
.csproj
arquivo:Esses são os mesmos valores que você verá se for na guia Pacote nas configurações do projeto. Embora eu não ache que você possa usar o
*
incremento automático da versão, o que você pode fazer é introduzir uma etapa de pós-processamento que substitui as versões para você (por exemplo, como parte de sua integração contínua).fonte
Fiz uma ferramenta CLI simples para definir strings de versão .csproj .NET Core aqui . Você pode combiná-lo com ferramentas como GitVersion para alteração automática de versão durante compilações de CI, se é isso que você procura.
fonte
Para habilitar o controle de versão de seu projeto .Net Core / .Net Whatever com base em sua configuração GIT, usando a funcionalidade tags / describe do GIT.
Tenho usado um arquivo Prebuild.targets.xml que está localizado na pasta raiz do projeto e incluído no arquivo csproj como:
Use a tag "GenerateAssembyInfo" para desativar a geração automática de informações de montagem.
Em seguida, o Prebuild.targets.xml irá gerar um arquivo CommonAssemblyInfo.cs onde você pode incluir as marcas de versão que deseja com base em sua versão GIT
NOTA: Eu encontrei o Prebuilds.targets.xml em outro lugar, então não me preocupei em limpá-lo.)
O arquivo Prebuild.targets.xml:
EDITAR: Se você estiver construindo usando o MSBUILD o
Pode causar problemas, use
em vez de
fonte
Você pode fazer o seguinte, dentro do arquivo csproj. Eu não descobri a matemática. Eu descobri isso em outro lugar no stackoverflow. Mas isso funciona e lhe dará algo semelhante a 1.0. * Para a versão.
fonte
A extensão de versões automáticas para Visual Studio agora oferece suporte ao autoincremento .Net Core e .Net Standard em uma interface de usuário simples.
https://marketplace.visualstudio.com/items?itemName=PrecisionInfinity.AutomaticVersions
fonte
Podemos usar parâmetros especiais para
dotnet publish -- version-suffix 1.2.3
Para a versão do arquivo:
Para a versão:
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore21
fonte
Obrigado a @joelsand por me apontar na direção certa.
Tive que mudar sua resposta ligeiramente, pois quando o DevOps Build foi executado, recebi a seguinte exceção
Tive que adicionar $ (BUILD_BUILDNUMBER) no final da seção major.minor.build. Para eliminar a duplicação da versão real, também uso um prefixo de versão:
fonte
Acho que esta resposta de @joelsand é a resposta correta para definir o número da versão para dotnet core rodando em VSTS
Para adicionar mais informações para esta resposta,
BUILD_BUILDNUMBER
é na verdade uma variável predefinida .Acontece que existem 2 versões de variáveis predefinidas.
Um é build.xxxx, o outro é BUILD_XXXX.
Você só pode usar
Environment Variable Name
em cproj.fonte
build.xxxx
usado no front end para fazer referência em um pipeline eBUILD_XXXX
tem o mesmo valor, mas com sintaxe ligeiramente modificada necessária para fazer referência à variável no PS?