1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-14 08:27:03 +03:00
juvix/app/Commands
Paul Cadman dad3963c00
Add package lockfile support (#2388)
This PR adds lock file support to the compiler pipeline. The lock file
is generated whenever a compiler pipeline command (`juvix {compile,
typecheck, repl}`) is run.

The lock file contains all the information necessary to reproduce the
whole dependency source tree. In particular for git dependencies,
branch/tag references are resolved to git hash references.

## Lock file format

The lock file is a YAML `juvix.lock.yaml` file written by the compiler
alongside the package's `juvix.yaml` file.

```
LOCKFILE_SPEC: { dependencies: { DEPENDENCY_SPEC, dependencies: LOCKFILE_SPEC }
DEPENDENCY_SPEC: PATH_SPEC | GIT_SPEC
PATH_SPEC: { path: String }
GIT_SPEC: { git: {url: String, ref: String, name: String } }
```

## Example

Consider a project containing the following `juvix.yaml`:

```yaml
dependencies:
- .juvix-build/stdlib/
- git:
   url: https://github.com/anoma/juvix-containers
   ref: v0.7.1
   name: containers
name: example
version: 1.0.0
```

After running `juvix compile` the following lockfile `juvix.lock.yaml`
is generated.

```yaml
# This file was autogenerated by Juvix version 0.5.1.
# Do not edit this file manually.

dependencies:
- path: .juvix-build/stdlib/
  dependencies: []
- git:
    name: containers
    ref: 3debbc7f5776924eb9652731b3c1982a2ee0ff24
    url: https://github.com/anoma/juvix-containers
  dependencies:
  - git:
      name: stdlib
      ref: 4facf14d9b2d06b81ce1be1882aa9050f768cb45
      url: https://github.com/anoma/juvix-stdlib
    dependencies: []
  - git:
      name: test
      ref: a7ac74cac0db92e0b5e349f279d797c3788cdfdd
      url: https://github.com/anoma/juvix-test
    dependencies:
    - git:
        name: stdlib
        ref: 4facf14d9b2d06b81ce1be1882aa9050f768cb45
        url: https://github.com/anoma/juvix-stdlib
      dependencies: []
```

For subsequent runs of the juvix compile pipeline, the lock file
dependency information is used.

 ## Behaviour when package file and lock file are out of sync

If a dependency is specified in `juvix.yaml` that is not present in the
lock file, an error is raised.

Continuing the example above, say we add an additional dependency:

```
dependencies:
- .juvix-build/stdlib/
- git:
     url: https://github.com/anoma/juvix-containers
     ref: v0.7.1
     name: containers
- git:
     url: https://github.com/anoma/juvix-test
     ref: v0.6.1
     name: test
name: example
version: 1.0.0
```

`juvix compile` will throw an error:

```
/Users/paul/tmp/lockfile/dep/juvix.yaml:1:1: error:
The dependency test is declared in the package's juvix.yaml but is not declared in the lockfile: /Users/paul/tmp/lockfile/dep/juvix.lock.json
Try removing /Users/paul/tmp/lockfile/dep/juvix.lock.yaml and then run Juvix again.
```

Closes:
* https://github.com/anoma/juvix/issues/2334
2023-10-02 17:51:14 +02:00
..
Compile Fix: add supported targets as option for compile commands (#1983) 2023-04-13 14:16:07 +02:00
Dev VampIR range checks and error handling (#2344) 2023-09-12 19:56:28 +02:00
Doctor Global offline flag (#2335) 2023-09-05 17:11:17 +02:00
Eval Print values in juvix eval (#2179) 2023-06-06 12:35:01 +02:00
Extra Avoid the -Os option when generating WebAssembly (#2378) 2023-09-21 13:15:36 +01:00
Format Remove old function syntax (#2305) 2023-08-24 16:24:47 +02:00
Html Show all available html themes in the CLI automatically (#2322) 2023-08-31 16:53:10 +02:00
Repl Add field projections for records (#2260) 2023-08-01 09:46:22 +01:00
Typecheck Support basic dependencies (#1622) 2022-12-20 13:05:40 +01:00
Base.hs Refactor CLI (#1527) 2022-09-14 16:16:15 +02:00
Clean.hs Update ci to use ormolu 0.5.3.0 and reformat project (#2313) 2023-08-25 17:37:23 +01:00
Compile.hs Add main field to juvix.yaml (#2120) 2023-05-24 15:42:20 +02:00
Dev.hs Add juvix dev repl command (#1941) 2023-03-31 00:57:44 +02:00
Doctor.hs Global offline flag (#2335) 2023-09-05 17:11:17 +02:00
Eval.hs Fix 'function not found' error in juvix eval (#2178) 2023-06-06 13:26:43 +02:00
Format.hs Update ci to use ormolu 0.5.3.0 and reformat project (#2313) 2023-08-25 17:37:23 +01:00
Html.hs Support more paths (#2000) 2023-04-19 15:56:48 +01:00
Init.hs Add package lockfile support (#2388) 2023-10-02 17:51:14 +02:00
Repl.hs Add Internet effect (#2337) 2023-09-07 18:26:19 +02:00
Typecheck.hs Update ci to use ormolu 0.5.3.0 and reformat project (#2313) 2023-08-25 17:37:23 +01:00