Describa el problema que está tratando de resolver
La solicitud de soporte más común que recibimos para crates.io es eliminar crates. Para evitar romper otras cajas/consumidores, rara vez podemos cumplir con estas solicitudes. Las razones comunes para la solicitud incluyen:
-
y _
, o modificar la carcasa ( foo
vs Foo
) de mi caja.Describa la solución que le gustaría
Durante una publicación, cargo
podría comprobar si la caja se ha publicado antes. Si esta es la primera publicación, cargo
solicitará al usuario que confirme varios metadatos de cajas. En particular, se le pedirá al usuario que confirme la ortografía exacta del nombre de la caja y el contenido de authors
. El usuario debe ser consciente de que no hay forma de cambiar o eliminar estos datos una vez que se publica una caja.
Después de la publicación inicial, cualquier cambio en authors
es un cambio explícito realizado en Cargo.toml
por lo que esta confirmación solo debe ocurrir una vez. Alternativamente, la solicitud de autoría podría realizarse como parte de cargo new
.
Algunas cajas se publican a través de CI u otros scripts. Para evitar interrumpir este caso de uso, la verificación y el aviso solo deben ocurrir en un TTY interactivo. Podríamos agregar un argumento de estilo --yes
y advertir si falta el argumento para una primera publicación no interactiva, sin embargo, creo que el indicador interactivo solo cubriría a la gran mayoría de los usuarios que se encuentran con sorpresas aquí.
notas
Podríamos vincular al usuario a las instrucciones para configurar el registro provisional, para cubrir el cuarto punto anterior. Sin embargo, creo que la prioridad debe ser comunicar claramente al usuario que el nombre de la caja es inmutable después de una publicación y confirmar que se siente cómodo compartiendo la información de autoría generada automáticamente.
Teóricamente, los registros alternativos podrían permitir cambiar el nombre o mutar las cajas. Creo que esto rompería muchas suposiciones en cargo
y el ecosistema. Por lo tanto, creo que esta verificación debería aplicarse a todos los registros, pero podría hacerse específica para crates.io si se desea. (Si decidimos señalar a los usuarios hacia la puesta en escena, eso solo debe hacerse para el registro predeterminado de crates.io).
Supongo que una alternativa a esto es que crates.io "ejecute en seco" y publique nuevas cajas de forma predeterminada, y envíe un correo electrónico al editor/propietario de la caja para confirmar que desea publicar. La caja no se agregaría al índice, tal vez, y no estaría disponible para su descarga, etc. hasta que se confirme la publicación a través de la interfaz de usuario web (o API, tal vez). Esto también podría ser útil, por ejemplo, para probar cambios en README u otros metadatos similares sin publicar varios parches en rápida sucesión.
Sin embargo, la implementación parece mucho más difícil para eso, por lo que tal vez la propuesta de este problema pueda ser un primer paso.
Además de pedirle al autor que confirme los detalles, Cargo también podría implementar controles para los errores comunes y advertir sobre ellos.
Advertencia: el nombre de la caja contiene letras mayúsculas. Los nombres de las cajas de óxido no distinguen entre mayúsculas y minúsculas y la mayoría de las cajas usan todos los nombres en minúsculas para mantener la coherencia.
Advertencia: el nombre de la caja contiene guiones. Cuando se usa el cajón en el código, los guiones se convierten en guiones bajos. El uso de guiones en los nombres de las cajas da como resultado que la caja tenga un nombre diferente en crates.io que en el código.
etc
publicación de "simulacro"
Esto me recuerda una solicitud de función interesante rust-lang/crates.io#1515 que sería bueno tener.
La caja no se agregaría al índice, tal vez, y no estaría disponible para su descarga, etc. hasta que se confirme la publicación a través de la interfaz de usuario web (o API, tal vez).
No creo que tengamos un problema abierto para esto, pero en algún lugar vi una sugerencia de que crates.io podría permitir la reserva de nombres de cajas por tiempo limitado (con la capacidad de actualizarlo manualmente cada pocos meses). Si tuviéramos la infraestructura para reservar nombres, entonces se podría construir una carcasa especial para la primera publicación. Nos gustaría que las cajas reservadas aparecieran en la búsqueda y que tuvieran algún tipo de página de destino que dijera que la caja está reservada o pendiente. (Y los nombres reservados podrían modificarse de forma compatible hasta que se publique la primera versión).
Esto también podría ser útil, por ejemplo, para probar cambios en README u otros metadatos similares sin publicar varios parches en rápida sucesión.
Realmente me gusta esta idea, ya que definitivamente hice algunos lanzamientos minutos después de ver que mi nuevo y brillante lanzamiento tiene un problema con el archivo README. Va más allá de los enfoques --dry-run[=verify]
y de primera publicación anteriores. Los usuarios podrían publicar con --dry-run=pending
y mostraríamos la versión como pendiente (similar a yanked
), pero solo los propietarios de la caja podrían ver la versión pendiente. Para el README en particular, el mayor problema que veo es que se pueden almacenar en caché (creo que durante 1 día actualmente) cuando se sirven desde S3. Por lo tanto, es posible que necesitemos casos especiales para las versiones pendientes.
Creo que estas características podrían funcionar bien juntas y proporcionar un buen camino para cambios incrementales. También estoy de acuerdo en que la carcasa especial del lado del servidor de primera publicación en este momento requeriría mucho trabajo. Sin embargo, me interesaría ver todas estas opciones exploradas más a fondo.
Comentario más útil
Supongo que una alternativa a esto es que crates.io "ejecute en seco" y publique nuevas cajas de forma predeterminada, y envíe un correo electrónico al editor/propietario de la caja para confirmar que desea publicar. La caja no se agregaría al índice, tal vez, y no estaría disponible para su descarga, etc. hasta que se confirme la publicación a través de la interfaz de usuario web (o API, tal vez). Esto también podría ser útil, por ejemplo, para probar cambios en README u otros metadatos similares sin publicar varios parches en rápida sucesión.
Sin embargo, la implementación parece mucho más difícil para eso, por lo que tal vez la propuesta de este problema pueda ser un primer paso.