Guia de implementação Java do NuGet Server
Em alguns casos, convém implementar seu próprio feed de pacotes do NuGet. Há muitas implementações existentes que permitem que você hospede seu próprio feed de uma maneira variada, mas o protocolo entre o software cliente do NuGet oficial e um feed de pacote está documentado, permitindo que você crie sua própria implementação de feed do zero.
O protocolo evolui com o tempo e este guia é voltado para aqueles que desejam ou já implementaram um servidor de pacotes do NuGet.
Desde o lançamento inicial do protocolo NuGet V3 em 2015, o NuGet evoluiu para fornecer aos desenvolvedores uma experiência mais rica, e isso requer que os repositórios de pacotes trabalhem mais para fornecer o valor adicional aos consumidores de pacotes, além de simplesmente exigir metadados de pacotes hospedados e retornar os metadados de várias formas. Por exemplo, os pontos de extremidade de metadados de pesquisa e pacote contêm mais do que apenas metadados encontrados no arquivo nuspec do nupkg.
Observe que este guia é focado no protocolo NuGet V3, uma vez que o protocolo V2 é essencialmente não documentado e, desde 2015, o protocolo recomendado para comunicação entre cliente e servidor do NuGet é o protocolo V3. Para obter mais informações, leia sobre o Controle de versão do protocolo.
Para ajudar os autores de repositórios do NuGet existentes a manterem-se atualizados com os recursos mais recentes do NuGet, aqui está a cronologia dos recursos relevantes mencionados no restante do documento.
Year | Recurso |
---|---|
2013 | Uma postagem no blog explicando como gerenciar proprietários de pacotes em nuget.org esclareceu que os proprietários mostrados no site são as contas que têm permissão para carregar novas versões e, portanto, os metadados owners no pacote são ignorados |
2017 | verified adicionado às respostas SearchQueryService . |
Suporte de controle de versão semântico 2.0.0 | |
2018 | Licenças incorporadas |
2019 | Ícones incorporados |
Depreciação do pacote em RegistrationBaseUrl (recurso de metadados do pacote) |
|
2020 | Informações de vulnerabilidade do pacote em RegistrationsBaseUrl (recurso de metadados do pacote) |
Adicionar parâmetros de consulta packageTypes a uma solicitação SearchQueryService |
|
2021 | Leia-me incorporado |
2023 | Pré-autenticar solicitações autenticadas Recurso VulnerabilityInfo |
Considere dois dos campos do arquivo de manifesto do pacote (.nuspec
), <authors>
e <owners>
.
Os autores de pacotes que estão empacotando conteúdo de terceiros geralmente colocam o nome de terceiros no campo <authors>
.
O campo <owners>
destinava-se a indicar quem publicou o pacote em um repositório e, portanto, quem deve ser contatado em caso de problemas de empacotamento ou perguntas.
Isso foi explicado em uma postagem no blog de 2013, portanto, o campo <owners>
é considerado obsoleto no arquivo .nuspec
.
Se o manifesto do pacote contiver esses metadados, ele deverá ser ignorado.
Não retorne o valor do campo <owners>
do arquivo .nuspec
na propriedade owners
no recurso de pesquisa ou na resposta JSON do recurso de metadados do pacote.
Se o repositório tiver permissões por pacote, é recomendável relatar as contas que têm permissões para publicar novas versões nos metadados owner
para respostas JSON de recursos de metadados de pesquisa e pacote.
A interface do usuário do Gerenciador de Pacotes do Visual Studio mostra uma marca de seleção azul ao lado de pacotes nos resultados do serviço de pesquisa, quando um novo campo verified
é definido como true
.
O NuGet.org usa isso com dados de prefixo de pacote (dados do lado do servidor, não parte da API do NuGet), para que essa marca de seleção só seja mostrada aos clientes quando a conta proprietária do pacote carregar o pacote.
Por exemplo, qualquer pacote com prefixo microsoft.*
é verificado somente quando o pacote pertence à conta da Microsoft em nuget.org. Qualquer pessoa que carregou um pacote com ID de pacote começando com microsoft.
antes que os prefixos reservados fossem implementados, não terá essa marca de seleção verificada.
O NuGet.org também permite que os prefixos não sejam exclusivos, para que qualquer pessoa possa carregar um pacote em Contoso.ToolWithPlugins.Community.*
, mas não obtenha uma marca de seleção verificada.
O NuGet oferece suporte a um híbrido entre System.Version
e a Versão semântica, mas o suporte para a Versão semântica 2.0.0 foi adicionado em 2017.
Portanto, os recursos da API do NuGet que retornam versões para versões de cliente inferiores à 3.6.0 não devem retornar pacotes que usam recursos semânticos 2.0.0 que são incompatíveis com o Controle de versão semântico 1.0.0.
As diferenças mais importantes entre as duas versões são os rótulos de pré-lançamento e a cadeia de caracteres de metadados.
A especificação do Controle de versão semântico 1.0.0 fornece [0-9A-Za-z-]
como uma cadeia de caracteres de expressão regular de exemplo para os únicos caracteres permitidos como parte do rótulo de pré-lançamento e não oferece suporte a cadeia de caracteres de metadados.
A especificação do Controle de versão semântico 2.0.0 permite que identificadores de pré-lançamento sejam separados por caracteres .
(e proíbe que um identificador numérico tenha um zero à esquerda) e, adicionalmente, permite que metadados de compilação sejam adicionados após um +
.
No recurso de metadados do pacote (RegistrationsBaseUrl
), as versões do recurso abaixo da 3.6.0 só devem retornar pacotes que estejam em conformidade com o System.Version
do .NET ou o Controle de versão semântico 1.0.0.
Isso significa que os pacotes cujas versões são compatíveis apenas com o Controle de versão semântico 2.0.0 são invisíveis para essas versões de cliente.
Da mesma forma, o serviço de consulta de pesquisa (SearchQueryService
) e o serviço de preenchimento automático (SearchAutocompleteService
) adicionaram parâmetros de consulta &semVerLevel={version}
.
Quando semVerLevel
estiver faltando, assuma o valor 1.0.0
.
Como o recurso de metadados do pacote, os pacotes cuja versão é compatível apenas com o Controle de versão semântico 2.0.0 não devem ser retornados quando o valor semVerLevel
estiver abaixo de 2.0.0.
Ícones de pacote, licença e arquivos leia-me podem ser (e é recomendado que sejam) incorporados no pacote.
Esses arquivos precisam de um ponto de extremidade de URL, extraído e colocado em um servidor de arquivos estático, ou uma URL que extraia dinamicamente os arquivos do .nupkg
mediante solicitação, para que eles possam ser visualizados sem baixar o nupkg
inteiro.
Se o repositório de pacotes fornecer navegação e visualização de detalhes do pacote, você poderá usar as URLs para mostrar aos clientes o conteúdo incorporado em seu site.
Finalmente, o recurso de metadados do pacote e o recurso de pesquisa devem conter a URL hospedada nas propriedades iconUrl
, licenseUrl
e/ou readmeUrl
da resposta JSON.
Os pacotes (arquivos .nupkg
) não devem ser modificados, pois os recursos do cliente (arquivos de bloqueio e pacotes assinados) detectarão modificações conforme o pacote tiver sido violado.
Observe que a licença pode ser uma expressão SPDX ou um arquivo incorporado (mas não ambos).
Os pacotes que usam uma expressão de licença, quando representados nos resultados de pesquisa e metadados do pacote, podem ter licenseUrl
definido como a expressão de licença, codificada por URL e anexada ao final de https://licenses.nuget.org/.
Por exemplo, https://licenses.nuget.org/Apache-2.0.
A equipe do servidor do NuGet.org tem documentação adicional em licenses.nuget.org.
O Recurso de Metadados do Pacote pode conter informações sobre depreciação e vulnerabilidade. Isso permite que os clientes que navegam em pacotes na Interface do Usuário do Gerenciador de Pacotes do Visual Studio, ou equivalente em outros IDEs, sejam notificados sobre problemas importantes de segurança ou manutenção.
Se o repositório de pacotes for “up-sourcing” de outro repositório, para espelhar pacotes em seu próprio feed, recomendamos verificar periodicamente a fonte original para ver se há dados de depreciação ou vulnerabilidade e espelhar esses metadados em seu próprio repositório.
Se o repositório de pacotes estiver fazendo up-sourcing do nuget.org especificamente, mantendo o estado da última vez que você verificou (um “cursor”), você poderá usar o recurso Catalog
para verificar com eficiência se há atualizações de pacotes para pacotes que você está espelhando, sem precisar baixar muitos arquivos JSON de metadados de pacote do feed de upstream.
Há um guia sobre como usar o recurso de catálogo com código de exemplo que pode ajudá-lo a começar.
Para fornecer verificação de vulnerabilidade de alto desempenho durante a restauração de pacotes, o NuGet baixa a lista completa de vulnerabilidades conhecidas do recurso VulnerabilityInfo
.
O Nuget.org fornece dados de vulnerabilidade para todos os avisos revisados do GitHub do banco de dados de avisos do GitHub, que inclui pacotes que não estão hospedados em nuget.org.
Se o repositório de pacotes estiver hospedando pacotes primários e você quiser fornecer informações sobre vulnerabilidades aos clientes usando seu próprio feed, mas ainda não tiver nenhuma vulnerabilidade de pacote divulgada, forneça um índice de vulnerabilidade com uma ou mais páginas de vulnerabilidade cujo conteúdo seja uma matriz JSON vazia ([]
).
Se o repositório de pacotes for destinado a ser usado por aplicativos como repositório padrão (em vez de nuget.org), você poderá usar os dados de vulnerabilidade do nuget.org.
Uma opção é usar a URL do índice de vulnerabilidade do nuget.org em seu índice de serviço.
Outra opção é verificar periodicamente o índice do nuget.org VulnerabilityInfo
e baixar todas as páginas alteradas para espelhar localmente.
A CLI do .NET permite pesquisar pacotes de ferramentas .NET com o comando dotnet tool search
.
Isso é implementado adicionando um parâmetro de consulta &packageTypes={value}
ao recurso de consulta de pesquisa, que lê valores do campo <packageTypes>
de arquivo .nuspec
do pacote.
Conforme descrito na visão geral da API do NuGet, a URL inicial para toda a comunicação com o servidor do NuGet é o índice de serviço.
Este documento contém as URLs de todos os outros recursos que os clientes do NuGet consultarão.
A partir do NuGet 6.7 (Visual Studio & MSBuild 17.7 e SDK do .NET 7.0.400), o NuGet usa HttpClientHandler.PreAuthenticate
do .NET, que só evita solicitações HTTP anônimas quando URLs subsequentes estão no mesmo diretório virtual, ou um subdiretório, de uma URL que foi autenticada anteriormente.
Isso reduzirá drasticamente o número de solicitações HTTP não autenticadas enviadas ao servidor e, portanto, reduzirá a carga de trabalho do servidor.
Estes são alguns exemplos:
URL | Vai preautenticar? |
---|---|
https://pkgs.contoso.com/nuget/v3/feed/index.json | N/A, este é o índice de serviço. |
https://pkgs.contoso.com/nuget/v3/search | Não, não no mesmo ou no subdiretório do índice de serviço. |
https://search.pkgs.contoso.com/nuget/v3/feed/ | Não, não no mesmo nome do host que o índice de serviço. |
https://pkgs.contoso.com/nuget/v3/feed/search | Sim, no mesmo diretório que o índice de serviço. |
https://pkgs.contoso.com/nuget/v3/registration/ | Não, não em um subdiretório do índice de serviço. |
https://pkgs.contoso.com/nuget/v3/feed/registration/ | Sim, em um subdiretório do índice de serviço. |
https://pkgs.contoso.com/nuget/v3/{guid}/registration/ | Consulte abaixo |
No último exemplo, o servidor pode ter um nome canônico (neste exemplo, um guid) e ter um ou mais aliases.
Se a solicitação de índice de serviço foi autenticada em uma URL não canônica (o nome “amigável”, em nosso feed
de exemplo), então não, nenhuma solicitação para recursos sob a URL canônica corresponderá às regras do HttpClientHandler
para PreAuthenticate
.
No entanto, se a URL não canônica for um redirecionamento HTTP para a URL canônica, https://pkgs.contoso.com/nuget/v3/{guid}/index.json, essa URL será usada no cache de credenciais do HttpClientHandler
.
Nesse caso, cada solicitação ao índice de serviço terá latência adicional, devido ao redirecionamento.
Embora a API V3 do NuGet tenha sido projetada para funcionar em um servidor de arquivos estático, o recurso de pesquisa é a exceção que sempre requer um serviço Web dinâmico para processar solicitações.
Se você deseja hospedar a pesquisa, ou mesmo qualquer outro recurso da API do NuGet, em servidores diferentes, a fim de se beneficiar da PreAuthenticate
do HttpClientHandler
, você precisará usar um proxy reverso para garantir que todas as URLs voltadas para o cliente no índice de serviço atendam à regra “no mesmo ou no subdiretório”.