Comparación de los ecosistemas de Chromium y Cargo

La comunidad de Rust suele usar cargo y bibliotecas de crates.io. Chromium se compila usando gn y ninja, además de un conjunto seleccionado de dependencias.

A la hora de escribir código en Rust, hay disponibles varias opciones:

A partir de ahora, nos centraremos en gn y ninja, ya que así es como se puede compilar el código de Rust en el navegador Chromium. De igual forma, Cargo es una parte importante del ecosistema de Rust y deberías conservarlo en tu caja de herramientas.

Ejercicio rápido

Formad grupos pequeños para:

  • Hacer una lluvia de ideas sobre situaciones en las que cargo pueda ofrecer ventajas y evaluar el perfil de riesgo.
  • Debatir en qué herramientas, bibliotecas y grupos de personas hay que confiar al usar gn y ninja, cargo offline, etc.

Pide a los participantes que eviten mirar las notas del orador antes de completar el ejercicio. Suponiendo que todas las personas que hacen el curso están en la misma sala, pídeles que hablen en grupos pequeños de 3 a 4 personas.

Notas y sugerencias relacionadas con la primera parte del ejercicio ("situaciones en las que Cargo puede ofrecer ventajas"):

  • Es genial que al escribir una herramienta o crear prototipos de una parte de Chromium se pueda acceder al extenso ecosistema de bibliotecas crates.io. Hay un crate para casi cualquier cosa y suelen ser muy fáciles de usar (clap para el análisis de la línea de comandos, serde para la serialización y deserialización a/desde varios formatos, itertools para trabajar con iteradores, etc.).

    • cargo permite probar una biblioteca fácilmente (solo hay que añadir una línea a Cargo.toml y empezar a escribir el código).
    • Merece la pena comparar cómo la CPAN ayudó a que perl fuera una opción popular o compararlo con python + pip.
  • La experiencia de desarrollo no solo es agradable gracias a las herramientas principales de Rust (por ejemplo, al usar rustup para cambiar a una versión diferente de rustc cuando se prueba un crate que necesita funcionar en nightly, stable actual y antiguas versiones de stable), sino también a un ecosistema de herramientas de terceros (por ejemplo, Mozilla proporciona cargo vet para optimizar y compartir auditorías de seguridad; el crate criterion ofrece un método optimizado para ejecutar comparativas).

    • cargo permite añadir fácilmente una herramienta mediante cargoinstall --locked cargo-vet.
    • Merece la pena compararlo con las extensiones de Chrome o con las de VScode.
  • Ejemplos generales y genéricos de proyectos en los que cargo puede ser la opción más adecuada:

    • Sorprendentemente, Rust se está volviendo cada vez más popular en el sector por su función de escritura de herramientas de línea de comandos. La amplitud y la ergonomía de las bibliotecas son similares a las de Python, pero son más sólidas (gracias al sistema de tipos enriquecido) y funcionan más rápido (como lenguaje compilado en lugar de interpretado).
    • Para participar en el ecosistema de Rust, es necesario usar herramientas estándar de Rust, como Cargo. Las bibliotecas que quieran recibir contribuciones externas y actuar fuera de Chromium (por ejemplo, en entornos de desarrollo de Bazel o Android/Soong) deberían utilizar Cargo.
  • Ejemplos de proyectos relacionados con Chromium que se basan en cargo:

    • serde_json_lenient (experimentado en otras partes de Google que ha dado lugar a PRs con mejoras de rendimiento).
    • Bibliotecas de fuentes, como font-types.
    • La herramienta gnrt (la veremos más adelante en el curso), que depende de clap para el análisis de la línea de comandos y de toml para los archivos de configuración.
      • Aclaración: una razón principal para usar cargo es que gn no está disponible al compilar e iniciar la biblioteca estándar de Rust cuando se compila su cadena de herramientas.
      • run_gnrt.py usa la copia de Chromium de cargo y rustc. gnrt depende de las bibliotecas de terceros descargadas de Internet. run_gnrt.py pide a cargo que solo se permita el contenido --locked a través de Cargo.lock.

Los participantes pueden tratar de identificar si los siguientes elementos son de confianza implícita o explícita:

  • rustc (el compilador de Rust), que a su vez depende de las bibliotecas LLVM, el compilador Clang, las fuentes rustc (obtenidas de GitHub y revisadas por el equipo de compilación de Rust), y el compilador binario de Rust descargado para el bootstrapping.
  • rustup (merece la pena destacar que rustup se desarrolla en la misma organización que rustc, https://github.com/rust-lang/).
  • cargo, rustfmt, etc.
  • Varias infraestructuras internas (bots que compilan rustc, sistemas para distribuir la cadena de herramientas precompiladas a los ingenieros de Chromium, etc.)
  • Herramientas de Cargo, como cargo audit, cargo vet, etc.
  • Bibliotecas de Rust incluidas en //third_party/rust (auditoría de security@chromium.org).
  • Otras bibliotecas de Rust (algunas de nicho, otras bastante populares y de uso común).