mirror of
https://github.com/NixOS/nix.dev.git
synced 2024-10-18 14:32:43 -04:00
Add outline for sharing deps tutorial
This commit is contained in:
parent
a094ffe818
commit
ce487905cd
|
@ -0,0 +1,64 @@
|
||||||
|
# Sharing dependencies between `default.nix` and `shell.nix`
|
||||||
|
|
||||||
|
## Assumptions
|
||||||
|
- The reader has seen a derivation before.
|
||||||
|
- The reader understands that builders come from `nixpkgs`.
|
||||||
|
- The reader knows what a shell environment is.
|
||||||
|
|
||||||
|
## Activity
|
||||||
|
|
||||||
|
<!-- What is the activity you're going to walk the reader through. -->
|
||||||
|
- Start with a `default.nix` that builds a project.
|
||||||
|
- Show the reader how to share dependencies between a build and a shell environment.
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
<!-- What is the reader supposed to gain from reading this? -->
|
||||||
|
- Show the reader how to set up a development environment.
|
||||||
|
- Show the reader how not to repeat themselves.
|
||||||
|
- Show the reader how to import one Nix file into another.
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
<!-- Prepare a bulleted outline of how you're going to walk the reader through this activity. -->
|
||||||
|
<!-- Be specific about how you're going to teach this activity, we want to catch any pitfalls before the writing phase. -->
|
||||||
|
- Begin with a `default.nix` that builds an application.
|
||||||
|
- Show the reader that the application builds.
|
||||||
|
- Present a scenario that prompts for a better working environment.
|
||||||
|
- We'd like to include modern development tooling like a test runner, linter, and formatter.
|
||||||
|
- Demonstrate that in order to bring those tools into our environment with the current `default.nix` those packages would also be included in the build even though they aren't necessary to build our application.
|
||||||
|
- (Optional) Add the packages to `propagatedBuildInputs` and show that they're included in the closure.
|
||||||
|
- Create a `shell.nix` to separate build dependencies from development dependencies.
|
||||||
|
- Duplicate dependencies from `default.nix` so that you can still perform the build in `shell.nix`.
|
||||||
|
- Add the development tools to `shell.nix` so that the reader has access to the during development.
|
||||||
|
- Demonstrate that you can still build the application.
|
||||||
|
- Explain that having to repeat yourself in both files is less than ideal and that you could easily forget to add a dependency to one file or the other.
|
||||||
|
- Introduce `mkShell.inputsFrom` as a way to prevent duplication.
|
||||||
|
- Explain that `inputsFrom` extracts `input` attributes from the supplied derivation and passes them to `mkShell`.
|
||||||
|
- Demonstrate how to import the `default.nix` and use its inputs.
|
||||||
|
- Demonstrate how to put the `mkShell` call in `default.nix`.
|
||||||
|
- Explain that defining the shell this way helps to keep more of the functionality in `default.nix`, leaving `shell.nix` to be the necessary glue to allow `nix-shell` to use the shell we've defined.
|
||||||
|
|
||||||
|
In the end you should end up with files that look like this (examples are Python just for demonstration purposes here):
|
||||||
|
```
|
||||||
|
# default.nix
|
||||||
|
let
|
||||||
|
myPackage = python3Packages.buildPythonApplication {
|
||||||
|
propagatedBuildInputs = [
|
||||||
|
python3Packages.flask
|
||||||
|
];
|
||||||
|
};
|
||||||
|
in myPackage // {
|
||||||
|
shell = mkShell {
|
||||||
|
inputsFrom = [
|
||||||
|
myPackage
|
||||||
|
];
|
||||||
|
buildInputs = [
|
||||||
|
curl
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# shell.nix
|
||||||
|
(import ./default.nix).shell
|
||||||
|
```
|
Loading…
Reference in a new issue