Sintaxis de definición de grupos de paquetes y comportamiento de coincidencia - CodeArtifact

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Sintaxis de definición de grupos de paquetes y comportamiento de coincidencia

Este tema contiene información sobre la definición de grupos de paquetes, el comportamiento de coincidencia de patrones, la fuerza de asociación de paquetes y la jerarquía de los grupos de paquetes.

Ejemplos y sintaxis de definiciones de grupos de paquetes

La sintaxis del patrón para definir los grupos de paquetes sigue de cerca el formato de las rutas de los paquetes. La ruta de un paquete se crea a partir de los componentes de coordenadas de un paquete (formato, espacio de nombres y nombre) añadiendo una barra inclinada al principio y separando cada uno de los componentes con una barra diagonal. Por ejemplo, la ruta del paquete npm nombrado en el espacio del espacio de nombres es anycompany-ui-components/npm/space/. anycompany-ui-components

El patrón de un grupo de paquetes sigue la misma estructura que una ruta de paquete, excepto que se omiten los componentes que no se especifican como parte de la definición del grupo y el patrón termina con un sufijo. El sufijo que se incluye determina el comportamiento de coincidencia del patrón, de la siguiente manera:

  • El $ sufijo coincidirá con la coordenada completa del paquete.

  • Un ~ sufijo coincidirá con un prefijo.

  • Un * sufijo coincidirá con todos los valores del componente definido anteriormente.

Estos son ejemplos de patrones para cada una de las combinaciones permitidas:

  1. Todos los formatos de paquete: /*

  2. Un formato de paquete específico: /npm/*

  3. Package format and namespace prefijo: /maven/com.anycompany~

  4. Formato y espacio de nombres del paquete: /npm/space/*

  5. Package formato, espacio de nombres y prefijo de nombre: /npm/space/anycompany-ui~

  6. Package: formato, espacio de nombres y nombre: /maven/org.apache.logging.log4j/log4j-core$

Como se muestra en los ejemplos anteriores, el ~ sufijo se añade al final de un espacio de nombres o nombre para representar una coincidencia de prefijos y, después de una barra diagonal, * se utiliza para hacer coincidir todos los valores del siguiente componente de la ruta (todos los formatos, todos los espacios de nombres o todos los nombres).

Definición y normalización de grupos de paquetes

CodeArtifact normaliza los NuGet nombres de los paquetes de Python y Swift, y normaliza los espacios de nombres de los paquetes de Swift antes de almacenarlos. CodeArtifact usa estos nombres normalizados al hacer coincidir los paquetes con las definiciones de los grupos de paquetes. Por lo tanto, los grupos de paquetes que contienen un espacio de nombres o un nombre en estos formatos deben usar el espacio de nombres y el nombre normalizados. Para obtener más información sobre cómo se normalizan los nombres de los paquetes y los espacios de nombres, consulte la documentación de normalización de nombres de NuGetPython y Swift.

Espacios de nombres en las definiciones de grupos de paquetes

Para los paquetes o formatos de paquetes sin un espacio de nombres (Python y NuGet), los grupos de paquetes no deben contener un espacio de nombres. La definición del grupo de paquetes para estos grupos de paquetes contiene una sección de espacio de nombres en blanco. Por ejemplo, la ruta del paquete de Python denominado requests es /python//requests.

Para los paquetes o formatos de paquetes con un espacio de nombres (Maven, generic y Swift), el espacio de nombres debe incluirse si se incluye el nombre del paquete. Para el formato de paquete Swift, se utilizará el espacio de nombres del paquete normalizado. Para obtener más información sobre cómo se normalizan los espacios de nombres de los paquetes de Swift, consulte. Normalización del nombre del paquete y del espacio de nombres de Swift

Jerarquía de los grupos de paquetes y especificidad de los patrones

Los paquetes que están «dentro» o «asociados» a un grupo de paquetes son paquetes con una ruta de paquete que coincide con el patrón del grupo pero no con el patrón de un grupo más específico. Por ejemplo, teniendo en cuenta los grupos de paquetes /npm/* y/npm/space/*, la ruta del paquete /npm//react está asociada al primer grupo (/npm/*), mientras que /npm/space/aui.components y /npm/space/ están asociados al segundo grupo (). amplify-ui-core /npm/space/* Aunque un paquete puede coincidir con varios grupos, cada paquete solo está asociado a un único grupo, la coincidencia más específica, y solo la configuración de ese grupo se aplica al paquete.

Cuando la ruta de un paquete coincide con varios patrones, el patrón «más específico» se puede considerar como el patrón coincidente más largo. Alternativamente, el patrón más específico es el que coincide con un subconjunto adecuado de los paquetes que coinciden con el patrón menos específico. En el ejemplo anterior, todos los paquetes que coinciden /npm/space/* también coinciden/npm/*, pero no ocurre lo contrario, lo que hace que /npm/space/* el patrón sea más específico, ya que es un subconjunto adecuado de. /npm/* Como un grupo es un subconjunto de otro grupo, crea una jerarquía, en la que /npm/space/* se encuentra un subgrupo del grupo principal. /npm/*

Aunque solo la configuración del grupo de paquetes más específico se aplica a un paquete, ese grupo puede configurarse para heredar la configuración de su grupo principal.

Concordancia de palabras, límites de palabras y prefijos

Antes de hablar sobre la coincidencia de prefijos, definamos algunos términos clave:

  • Una palabra, una letra o un número seguido de cero o más letras, números o caracteres de marca (como acentos, diéresis, etc.).

  • El límite de una palabra se encuentra al final de una palabra, cuando se llega a un carácter que no es una palabra. Los caracteres que no son palabras son signos de puntuación como., y. - _

En concreto, el patrón de expresiones regulares de una palabra es[\p{L}\p{N}][\p{L}\p{N}\p{M}]*, que se puede desglosar de la siguiente manera:

  • \p{L}representa cualquier letra.

  • \p{N}representa cualquier número.

  • \p{M}representa cualquier carácter de marca, como acentos, diéresis, etc.

Por lo tanto, [\p{L}\p{N}] representa un número o una letra y [\p{L}\p{N}\p{M}]* representa cero o más letras, números o caracteres de marca, y el límite de una palabra se encuentra al final de cada coincidencia de este patrón de expresiones regulares.

nota

La concordancia de los límites de las palabras se basa en esta definición de «palabra». No se basa en las palabras definidas en un diccionario, o CameCase. Por ejemplo, no hay límite de palabras en oneword oOneWord.

Ahora que la palabra y el límite de la palabra están definidos, podemos usarlos para describir las coincidencias de prefijos. CodeArtifact Para indicar una coincidencia de prefijo en el límite de una palabra, se utiliza un carácter coincidente (~) después de un carácter de palabra. Por ejemplo, el patrón /npm/space/foo~ coincide con las rutas del paquete /npm/space/foo y/npm/space/foo-bar, pero no con /npm/space/food o/npm/space/foot.

Es necesario utilizar un comodín (*) en ~ vez de seguir a un carácter que no sea una palabra, como en el patrón. /npm/*

Sensibilidad de mayúsculas y minúsculas

Las definiciones de grupos de paquetes distinguen entre mayúsculas y minúsculas, lo que significa que los patrones que solo difieren según las mayúsculas y minúsculas pueden existir como grupos de paquetes separados. Por ejemplo, un usuario puede crear grupos de paquetes separados con los patrones /npm//AsyncStorage$ y /npm//asyncstorage$ para los tres paquetes separados que existen en el registro público de npm: asyncStorage y asyncstorage AsyncStorage, que solo difieren según las mayúsculas y minúsculas. /npm//asyncStorage$

Si bien las mayúsculas y minúsculas son importantes, CodeArtifact sigue asociando los paquetes a un grupo de paquetes si el paquete tiene una variación del patrón que difiere según las mayúsculas y minúsculas. Si un usuario crea el grupo de /npm//AsyncStorage$ paquetes sin crear los otros dos grupos que se muestran arriba, todas las variantes del nombre en mayúsculas y minúsculas AsyncStorage, incluidas AsyncStorage y asyncstorage, se asociarán al grupo de paquetes. Sin embargo, como se describe en la siguiente secciónEmparejamiento fuerte y débil, estas variaciones se tratarán de forma diferente AsyncStoragea la que se corresponde exactamente con el patrón.

Emparejamiento fuerte y débil

La información de la sección anterior,Sensibilidad de mayúsculas y minúsculas, indica que los grupos de paquetes distinguen mayúsculas de minúsculas y, a continuación, explica que no distinguen mayúsculas de minúsculas. Esto se debe a que las definiciones de grupos de paquetes CodeArtifact tienen un concepto de coincidencia fuerte (o coincidencia exacta) y coincidencia débil (o coincidencia de variantes). Una coincidencia fuerte es cuando el paquete coincide exactamente con el patrón, sin ninguna variación. Una coincidencia débil se produce cuando el paquete coincide con una variación del patrón, por ejemplo, con mayúsculas y minúsculas diferentes. El comportamiento de coincidencia débil impide que los paquetes que son variaciones del patrón de un grupo de paquetes se acumulen en un grupo de paquetes más general. Cuando un paquete es una variante (coincidencia débil) del patrón del grupo coincidente más específico, el paquete se asocia al grupo, pero el paquete se bloquea en lugar de aplicar la configuración de control de origen del grupo, lo que impide que cualquier nueva versión del paquete se extraiga de las versiones anteriores o se publique. Este comportamiento reduce el riesgo de que se produzcan ataques a la cadena de suministro debido a la confusión de dependencias entre paquetes con nombres casi idénticos.

Para ilustrar el comportamiento de coincidencia débil, supongamos que el grupo de paquetes /npm/* permite la ingestión y bloquea la publicación. Un grupo de paquetes más específico,/npm//anycompany-spicy-client$, está configurado para bloquear la ingesta y permitir la publicación. El nombre anycompany-spicy-clientdel paquete coincide perfectamente con el grupo de paquetes, lo que permite publicar las versiones de los paquetes y bloquea la ingesta de las versiones de los paquetes. El nombre del paquete solo se puede publicar en mayúsculas anycompany-spicy-client, ya que se ajusta perfectamente al patrón de definición del paquete. Se ha bloqueado la publicación de una variante de mayúsculas y minúsculas, como AnyCompany-spicy-client porque no coincide adecuadamente. Y lo que es más importante, el grupo de paquetes bloquea la introducción de todas las variantes de mayúsculas y minúsculas, no solo del nombre en minúscula utilizado en el patrón, lo que reduce el riesgo de que se produzca un ataque de confusión de dependencias.

Variantes adicionales

Además de las diferencias entre mayúsculas y minúsculas, la coincidencia débil también ignora las diferencias en las secuencias de - guiones, puntos., guiones bajos _ y caracteres que pueden confundirse (como los caracteres de aspecto similar de alfabetos distintos). Durante la normalización, que se utiliza para evitar coincidencias débiles, CodeArtifact se utilizan mayúsculas y minúsculas (similar a la conversión a minúsculas), se sustituyen las secuencias de guiones, puntos y guiones bajos por un solo punto y se normalizan los caracteres que pueden confundirse.

La coincidencia débil considera que los guiones, puntos y guiones bajos son equivalentes, pero no los ignora por completo. Esto significa que foo-bar, foo.bar, foo.. bar y foo_bar son todos equivalentes de coincidencias débiles, pero foobar no. Si bien varios repositorios públicos implementan medidas para evitar este tipo de variaciones, la protección que proporcionan los repositorios públicos no hace innecesaria esta función de los grupos de paquetes. Por ejemplo, los repositorios públicos, como el registro público de npm, solo evitarán nuevas variaciones del paquete denominado my-package si my-package ya está publicado en ellos. Si my-package es un paquete interno y se crea un grupo de paquetes que permite la publicación y bloquea la ingesta, /npm//my-package$ es probable que no desees publicar my-package en el registro público de npm para evitar que se permita una variante como my.package.

Si bien algunos formatos de paquete, como Maven, tratan estos caracteres de manera diferente (Maven los trata . como un separador jerárquico de espacios de nombres, pero no lo es_), algo como com.act-on podría confundirse con - com.act.on.

nota

Tenga en cuenta que siempre que se asocien varias variantes a un grupo de paquetes, el administrador puede crear un nuevo grupo de paquetes para una variante específica a fin de configurar un comportamiento diferente para esa variación.