Asignación de origen del paquete
La asignación de origen del paquete es una herramienta que se puede usar para mejorar la seguridad de la cadena de suministro, especialmente si usa una combinación de orígenes de paquetes públicos y privados.
De forma predeterminada, NuGet buscará todos los orígenes de paquetes configurados cuando necesite descargar un paquete. Cuando hay un paquete en varios orígenes, es posible que no sea determinista desde qué origen se descargará el paquete. Con la asignación de origen del paquete, puede filtrar por paquete qué orígenes debe buscar NuGet.
También tenemos sugerencias para otros procedimientos recomendados que le ayudarán a fortalecer su cadena de suministro contra ataques.
La asignación de origen del paquete se agregó en NuGet 6.0. A partir de Visual Studio 17.5, puede agregar y eliminar asignaciones de paquetes de origen con el cuadro de diálogo Opciones de Visual Studio.
Compatibilidad con Visual Studio
Visual Studio | Asignación de origen del paquete | Compatibilidad con herramientas:> opciones | Compatibilidad con la interfaz de usuario del Administrador de paquetes |
---|---|---|---|
17.0 - 17.4 | ✅ Disponible | ❌ No disponible | ❌ No disponible |
17.5 | ✅ Disponible | ✅ Disponible | ❌ No disponible |
17.7, versión preliminar 3 | ✅ Disponible | ✅ Disponible | ✅ Estado mostrado |
La característica está disponible en todas las herramientas integradas de NuGet.
- Visual Studio 2022 y versiones posteriores
- SDK de .NET 6.0.100 y versiones posteriores
- nuget.exe 6.0.0 y versiones posteriores
Las herramientas anteriores omitirán la configuración de asignación de origen del paquete. Para usar esta característica, asegúrese de que todos los entornos de compilación usan versiones de herramientas compatibles.
Las asignaciones de origen del paquete se aplicarán a todos los tipos de proyecto, incluido .NET Framework, siempre y cuando se utilicen herramientas compatibles.
Tutorial en vídeo
Si desea obtener información general en vídeo de la característica Asignación de origen del paquete, vea el vídeo Secure your NuGet packages with Package Source Mapping (Protección de los paquetes de NuGet con asignación de origen de paquetes) en YouTube.
Habilitación de la asignación de origen del paquete
Para participar en esta característica, debe tener un archivo nuget.config
. Tener un solo nuget.config
en la raíz del repositorio se considera un procedimiento recomendado. Consulte la documentación de nuget.config para obtener más información.
Habilitar mediante el cuadro de diálogo Opciones de Visual Studio
- Abra su solución en Visual Studio.
- Vaya al
Package Source Mappings
cuadro de diálogo Opciones.
Desde la interfaz de usuario del administrador de paquetes
- Seleccione un paquete de la lista para mostrarlo en el panel de detalles.
- Presione el botón
Configure
para abrir la página de opciones Asignaciones de origen de paquetes.
En el cuadro de diálogo Opciones de Visual Studio
- Vaya al menú
Tools
de la barra de herramientas principal de Visual Studio y elijaNuGet Package Manager
->Package Manager Settings
. - Vaya a la página
Package Source Mappings
.
- Presione el botón
Add
de la páginaPackage Source Mappings
para abrir el cuadro de diálogoAdd Package Source Mappings
.
4. Escriba un id. de paquete o un patrón de paquete y seleccione uno o varios orígenes de paquete alternando la casilla para los orígenes deseados.
- La página de opciones
Package Source Mapping
mostrará la asignación de origen recién creada.
- Presione
OK
en el cuadro de diálogo Opciones para guardar los cambios en el objeto aplicablenuget.config
. - La ventana Administrador de paquetes NuGet se actualizará y reflejará el nuevo estado de las asignaciones de origen del paquete seleccionado.
Habilitación mediante la edición manual nuget.config
- Declare los orígenes de paquete deseados en el archivo
nuget.config
. - Después de las declaraciones de origen, agregue un elemento
<packageSourceMapping>
que especifique las asignaciones deseadas para cada origen. - Declare exactamente un elemento
packageSource
para cada origen en uso.- Agregue tantos patrones como sea necesario.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- Define the package sources, nuget.org and contoso.com. -->
<!-- `clear` ensures no additional sources are inherited from another config file. -->
<packageSources>
<clear />
<!-- `key` can be any identifier for your source. -->
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="contoso.com" value="https://contoso.com/packages/" />
</packageSources>
<!-- Define mappings by adding package patterns beneath the target source. -->
<!-- Contoso.* packages and NuGet.Common will be restored from contoso.com,
everything else from nuget.org. -->
<packageSourceMapping>
<!-- key value for <packageSource> should match key values from <packageSources> element -->
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
<packageSource key="contoso.com">
<package pattern="Contoso.*" />
<package pattern="NuGet.Common" />
</packageSource>
</packageSourceMapping>
</configuration>
La configuración de la asignación de origen del paquete se aplica siguiendo las reglas de prioridad de nuget.config cuando hay varios archivos nuget.config
en varios niveles (nivel de máquina, nivel de usuario, nivel de repositorio).
Reglas de asignación de origen del paquete
Para obtener la máxima flexibilidad y control, NuGet requiere que todos los paquetes coincidan con un patrón de paquete mediante una prioridad bien definida.
Requisitos del patrón de paquete
Todos los paquetes solicitados deben asignarse a uno o varios orígenes coincidiendo con un patrón de paquete definido. En otras palabras, una vez que haya definido un elemento packageSourceMapping
, debe definir explícitamente desde qué orígenes se restaurará cada paquete, incluidos los paquetes transitivos.
- Tanto los paquetes de nivel superior como los transitivos deben coincidir con los patrones definidos. No es necesario que un paquete de nivel superior y sus dependencias procedan del mismo origen.
- El mismo patrón de identificador se puede definir en varios orígenes, lo que permite restaurar los identificadores de paquete correspondientes desde cualquiera de las fuentes que definen el patrón. Sin embargo, esto no se recomienda debido al impacto en la previsibilidad de la restauración (un paquete determinado podría proceder de varios orígenes). Puede ser una configuración válida si confía en todos los orígenes respectivos.
Sintaxis del patrón de paquete
Patrón | Ejemplo de sintaxis | Descripción |
---|---|---|
Patrón de prefijo de paquete | * , NuGet.* |
Debe terminar con * , donde * coincide con 0 o más caracteres. * es el patrón de prefijo permitido más corto y coincide con todos los identificadores de paquete. |
Patrón de identificador de paquete | NuGet.Common , Contoso.Contracts |
Identificador exacto del paquete. |
Prioridad del patrón de paquete
Cuando varios patrones únicos coinciden con un identificador de paquete, se prefiere el más específico. Los patrones de identificador de paquete siempre tienen la prioridad más alta, mientras que el *
genérico siempre tiene la prioridad más baja. Para los patrones de prefijo de paquete, el más largo tiene prioridad.
Establecimiento de orígenes predeterminados
El patrón *
se puede usar para declarar un origen predeterminado de facto, lo que significa que cualquier paquete que no coincida con otros patrones especificados se restaurará desde ese origen sin producir un error.
Esta configuración es ventajosa si usa principalmente paquetes de, por ejemplo, nuget.org
, y solo tiene algunos paquetes internos, o bien usa prefijos estándar para todos los paquetes internos, como Contoso.*
.
Si su equipo no utiliza prefijos estándar para los identificadores de los paquetes internos o examina los paquetes nuget.org
antes de su instalación, hacer que un origen privado sea el predeterminado se adaptará mejor a sus necesidades.
Nota:
Cuando el paquete solicitado ya existe en la carpeta de paquetes global, no se realizará ninguna búsqueda de origen y se omitirán las asignaciones. Considere la posibilidad de declarar una carpeta de paquetes global para el repositorio a fin de obtener todas las ventajas de seguridad de esta característica. Trabaja para mejorar la experiencia con la carpeta de paquetes global planificada para una siguiente iteración. Para más información sobre cómo funciona la instalación de paquetes, consulte el documento conceptual.
Introducción
Hay 2 maneras de incorporar completamente el repositorio, manualmente o mediante la herramienta NuGet.PackageSourceMapper.
Incorporación manual
Para la incorporación manual, puede realizar los pasos siguientes:
- Declare una nueva carpeta de paquetes global para el repositorio.
- Ejecute dotnet restore para restaurar las dependencias.
- Ejecute
dotnet list package --include-transitive
para ver todos los paquetes de nivel superior y transitivos de la solución.- Para los proyectos de .NET Framework que usan
packages.config
, el archivopackages.config
tendrá una lista plana de todos los paquetes directos y transitivos.
- Para los proyectos de .NET Framework que usan
- Defina asignaciones de forma que cada identificador de paquete de la solución (incluidos los paquetes transitivos) coincidan con un patrón para el origen de destino.
- Ejecute dotnet nuget locals global-packages -c para borrar el directorio global-packages.
- Ejecute la restauración para validar que ha configurado las asignaciones correctamente. Si sus asignaciones no cubren completamente cada identificador de paquete en su solución, los mensajes de error le ayudarán a identificar el problema.
- Cuando la restauración se realice correctamente, ya habrá terminado. Opcionalmente, tenga en cuenta lo siguiente:
- Simplificar la configuración a un menor número de declaraciones utilizando prefijos de identificador de paquetes más amplios o estableciendo una fuente predeterminada cuando sea posible.
- Verificar el origen de cada paquete restaurado comprobando los archivos de metadatos en la carpeta de paquetes global o revisando los registros de restauración.
Incorporación automatizada mediante la herramienta
Muchos repositorios tienen un gran número de paquetes y el trabajo manualmente puede llevar mucho tiempo. La herramienta NuGet.PackageSourceMapper puede generar automáticamente un NuGet.config automáticamente, en función de los orígenes y paquetes conocidos del proyecto.
La herramienta del asignador de origen del paquete requiere que haya completado una restauración correcta del paquete en la que leerá cada archivo .nupkg.metadata
respectivo generado como parte de la compilación para comprender mejor cómo se asignan los respectivos paquetes y orígenes. La herramienta no solo cubre las principales dependencias que también tiene en cuenta todas las dependencias transitivas al generar la asignación.
La herramienta tiene varias opciones para generar el patrón de asignación en función de sus necesidades, consulte la entrada de blog y la instrucción Léame de la herramienta para obtener más detalles.
Para obtener una idea del aspecto que pueden tener las asignaciones de origen, consulte nuestro repositorio de ejemplo.
Nota:
- No hay comandos nuget.exe o dotnet.exe para administrar la configuración de la asignación de origen de los paquetes, consulte NuGet/Home#10735.
- No hay ningún medio de asignar paquetes en el momento de su instalación, consulte NuGet/Home#10730.
- Hay una limitación al usar la tarea de Azure Pipelines
DotNetCoreCLI@2
que se puede solucionar mediante prefijosfeed-
en la configuración de asignación de origen. Sin embargo, se recomienda usarNuGetAuthenticate
para sus necesidades de autenticación y llamar a la CLI de dotnet directamente desde una tarea de script. Consulte microsoft/azure-pipelines-tasks#15542.