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:
- Usar
gn
yninja
con la ayuda de las plantillas de//build/rust/*.gni
(por ejemplo,rust_static_library
, que veremos más adelante). Se usan la cadena de herramientas y los crates auditados de Chromium. - Usar
cargo
, pero restringiendo el uso de la cadena de herramientas y los crates auditados de Chromium. - Usa
cargo
con una cadena de herramientas o crates descargados de Internet.
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
yninja
,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 aCargo.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 conpython
+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 derustc
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 proporcionacargo vet
para optimizar y compartir auditorías de seguridad; el cratecriterion
ofrece un método optimizado para ejecutar comparativas).cargo
permite añadir fácilmente una herramienta mediantecargoinstall --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 declap
para el análisis de la línea de comandos y detoml
para los archivos de configuración.- Aclaración: una razón principal para usar
cargo
es quegn
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 decargo
yrustc
.gnrt
depende de las bibliotecas de terceros descargadas de Internet.run_gnrt.py
pide acargo
que solo se permita el contenido--locked
a través deCargo.lock
.
- Aclaración: una razón principal para usar
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 fuentesrustc
(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 querustup
se desarrolla en la misma organización querustc
, 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).