Intro

En vrac, les outils que j'utilise et perfectionne dans mon apprentissage et mon utilisation du language Rust.

MAJ de Rust

On installe Rustup si il n'est pas présent :

curl https://sh.rustup.rs -sSf | sh

Puis on installe une version Nightly

Plusieursfonctionnalités non stabilisés sont disponibles sur la version nightly (notamment l'api de linter utilisé par Clippy dans le paragraphe suivant)

rustup install nightly
  • On met à jour sa version de Rust

Ceci va mettre à jour notre version stable de Rust (par exemple passer de la 1.14 à la 1.16) mais aussi mettre à jour notre version nightly sur le dernier instantanné. (commit github)

rustup update

Assurance qualité avec le Linter Clippy

Dans Rust, il y a des bonnes pratiques ainsi que des faiblesses dans le compilateur de Rust (eh oui). Pour pallier à ça, il existe l'utilitaire Clippy, un outil d'analyse statique qui va appliquer environ 200 règles sur le code parcourus.

Pour utiliser Clippy, il faut actuellement utiliser Rust en nightly :

rustup default nightly

puis dans le fichier toml

[dependencies]
clippy = {version = "*", optional = true}

[features]
default = []

Et dans le fichier main.rs or lib.rs:

#![cfg_attr(feature="clippy", feature(plugin))]
#![cfg_attr(feature="clippy", plugin(clippy))]

Enfin, lancer l'analyse via :

cargo build --features "clippy"

Sublime-Text

  • Support de la coloration synthaxique de Rust https://packagecontrol.io/installation
  • BeautifyRust : formate le code Rust pour qu'il suive les bonnes conventions de codage. (et évite d'y penser) Nécessite et utilise : rustfmt
  • RustAutocomplete

Vous n'utilisez pas Sublime ou vous désirez en savoir d'avantage : https://areweideyet.com/

Editeurs en ligne

Cargo graph

Si vous désirez connaitre les dépendance de votre projet, vous pouvez étendre les fonctionnalités de cargo avec cargo graph.

Pour simplifier encore les choses, je me suis créé un petit script python :

import os
import sys
import subprocess
import toml

os.chdir(sys.argv[1])
package_name = ''
with open("Cargo.toml", "r") as conffile:
    config = toml.loads(conffile.read())
    package_name = config["package"]["name"]

subprocess.call(
    "cargo graph --optional-line-style dashed --optional-line-color red"
    * " --optional-shape box --build-shape diamond"
    * " --build-color green --build-line-color orange"
    * " >| {0}.dot".format(package_name),
    shell=True
)
subprocess.call(
    "dot -Tpng > {0}.png {0}.dot".format(package_name),
    shell=True
)

et dans mon .zshrc :

graph () {
    CARGO_PACKAGE_PATH=$PWD;
    VIRTUAL_PATH="my_scripts"
    launchPythonScript "python3 ./cargo_graph.py $CARGO_PACKAGE_PATH"
}

Du coup, en appelant mon utilitaire graph, je vais créer automatiquement à la source de mon projet, un fichier projet.dot et projet.png correspondant. Le nom du projet est directement récupérer dans le Cargo.toml.

bot Irc Playbot

playbot: std::mem::size_of::<bool>()

équivalent à :

fn main() {
    println!("{:?}", std::mem::size_of::<bool>());
}

Exemples

http://dev.unhandledexpression.com/slides/devoxx-2016/

Recherche de libs

https://docs.rs/ https://crates.io/

Coverage

https://users.rust-lang.org/t/tutorial-how-to-collect-test-coverages-for-rust-project/650

https://github.com/hyperium/hyper/blob/master/.travis.yml

Débuggage

Dans votre bashrc et/ou zshrc :

export RUST_BACKTRACE=1

#sh
strace cargo run --bin projet

Rust fait beaucoup de vérifications au niveau de la compilation mais ne peut bien évidement pas couvrir la partie dynamique. Il subsite donc des erreurs à l'exécution : pour les débusquer, gdb est notre ami.

gdb target/debug/le_fichier_concerne
(gdb) run

Déploiement

cargo build --release

https://github.com/mmstick/cargo-deb

En vrac

http://rust.developpez.com/faq


Comments

comments powered by Disqus