Add a command for building and installing a locally-developed Zed extension (#8781)

This PR adds an `zed: Install Local Extension` action, which lets you
select a path to a folder containing a Zed extension, and install that .
When you select a directory, the extension will be compiled (both the
Tree-sitter grammars and the Rust code for the extension itself) and
installed as a Zed extension, using a symlink.

### Details

A few dependencies are needed to build an extension:
* The Rust `wasm32-wasi` target. This is automatically installed if
needed via `rustup`.
* A wasi-preview1 adapter WASM module, for building WASM components with
Rust. This is automatically downloaded if needed from a `wasmtime`
GitHub release
* For building Tree-sitter parsers, a distribution of `wasi-sdk`. This
is automatically downloaded if needed from a `wasi-sdk` GitHub release.

The downloaded artifacts are cached in a support directory called
`Zed/extensions/build`.

### Tasks

UX

* [x] Show local extensions in the Extensions view
* [x] Provide a button for recompiling a linked extension
* [x] Make this action discoverable by adding a button for it on the
Extensions view
* [ ] Surface errors (don't just write them to the Zed log)

Packaging

* [ ] Create a separate executable that performs the extension
compilation. We'll switch the packaging system in our
[extensions](https://github.com/zed-industries/extensions) repo to use
this binary, so that there is one canonical definition of how to
build/package an extensions.

### Release Notes:

- N/A

---------

Co-authored-by: Marshall <marshall@zed.dev>
Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>
This commit is contained in:
Max Brunsfeld 2024-03-06 15:35:22 -08:00 committed by GitHub
parent e273198ada
commit 675ae24964
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 1662 additions and 763 deletions

26
Cargo.lock generated
View file

@ -3543,19 +3543,24 @@ dependencies = [
"wasmparser",
"wasmtime",
"wasmtime-wasi",
"wit-component 0.20.3",
]
[[package]]
name = "extensions_ui"
version = "0.1.0"
dependencies = [
"anyhow",
"client",
"editor",
"extension",
"fuzzy",
"gpui",
"settings",
"smallvec",
"theme",
"ui",
"util",
"workspace",
]
@ -12426,7 +12431,7 @@ dependencies = [
"heck 0.4.1",
"wasm-metadata",
"wit-bindgen-core",
"wit-component",
"wit-component 0.21.0",
]
[[package]]
@ -12443,6 +12448,25 @@ dependencies = [
"wit-bindgen-rust",
]
[[package]]
name = "wit-component"
version = "0.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4436190e87b4e539807bcdcf5b817e79d2e29e16bc5ddb6445413fe3d1f5716"
dependencies = [
"anyhow",
"bitflags 2.4.2",
"indexmap 2.0.0",
"log",
"serde",
"serde_derive",
"serde_json",
"wasm-encoder 0.41.2",
"wasm-metadata",
"wasmparser",
"wit-parser 0.13.2",
]
[[package]]
name = "wit-component"
version = "0.21.0"