Skip to content

Latest commit

 

History

History
62 lines (45 loc) · 2.74 KB

CONTRIBUTING.md

File metadata and controls

62 lines (45 loc) · 2.74 KB

Contributing to ghciwatch

👍🎉 First off, thanks for taking the time to contribute! 🎉👍

Code of Conduct

This project and everyone participating in it is governed by the Contributor Covenant Code of Conduct.

Local Development

TL;DR: Use nix develop, but you may be able to scrape by with cargo.

A standard Rust installation with cargo is sufficient to build ghciwatch. If you're new to Rust, check out Rust for Haskellers.

To run tests, you'll need Nix/Lix installed. Run nix develop to enter a development shell with all the dependencies available and then use cargo nextest run to run the tests (including the integration tests) with cargo-nextest. (cargo test will work, too, but slower.)

You can run the tests with coverage output with cargo llvm-cov nextest. it is possible to display coverage information in VSCode, with cargo llvm-cov --lcov --output-path lcov.info.

Running the test suite without Nix

Running the tests outside of Nix is generally not supported, but may be possible. You'll need a Haskell installation including GHC, cabal, and hpack. If you'd like to run the tests with (e.g.) GHC 9.6.5 and 9.8.2, run GHC="9.6.5 9.8.2" cargo nextest run. The test suite will expect to find executables named ghc-9.6.5 and ghc-9.8.2 on your $PATH.

Why Rust?

Rust makes it easy to ship static binaries. Rust also shares many features with Haskell: a Hindley-Milner type system with inference, pattern matching, and immutability by default. Rust can also interoperate with Haskell, so in the future we'll be able to ship ghciwatch as a Hackage package natively. Also, Rust's commitment to stability makes coping with multiple GHC versions and GHC upgrades easy. Finally, Rust is home to the excellent cross-platform and battle-tested notify library, used to implement the watchexec binary and cargo-watch, which solves a lot of the thorny problems of watching files for us.