# Extension packaging and installation
## Function
`bt ext` is a BT extension toolchain, used to create extension projects, build `.bts` packages, install to projects, view package information and perform load checks. The official extension library is installed remotely using the top-level command `bt install`.
## Command
```text
bt ext new
[--kind bt|wasm]
bt ext build [dir] [-o ]
bt ext install [project_dir]
bt ext info
bt ext check [dir|file.bts]
bt install [version] [--project ]
```
## Parameters
| Command | Description |
| ------ | ------ |
| `new ` | Create an extension development directory and generate `kind=bt` scaffolding by default. |
| `new --kind wasm` | Create WASM extension development directory and generate Rust SDK scaffolding. |
| `build [dir]` | Package `.bts` from the extension development directory, and output `.bts` by default. |
| `build [dir] -o ` | Specify the output package path, the `.bts` suffix must be used. |
| `install [dir]` | Verify the local package and copy it to the target project `extensions//-.bts`. |
| `info ` | View summary of manifest, permissions, entries, objects and methods. |
| `check [dir|file]` | Verify that the development directory or `.bts` package can be loaded by the current BT build. |
| `bt install ` | Install the latest compatible version from the official website extension library. |
| `bt install ` | Install the specified three-stage version from the official website extension library. |
| `--project ` | Specify the remote installation target project directory, the default is the current directory. |
## Return Value
`bt ext` is a command line tool and does not return a value to the BT script. When the command is successful, the execution progress and results are output; when the command fails, a Chinese error is output and a failure status is returned.
## Packaging rules
`bt ext build` will collect ordinary files in the development directory and skip:
```text
target/
.git/
.hg/
.svn/
node_modules/
```
When packaging, the number of `.bts` package entries, single file size, total decompression size and path within the package will be limited. After writing the zip, the tool will read back `.bts` and initialize the corresponding Runner to ensure that the package can be loaded at runtime.
## Installation rules
installation command:
```text
bt ext install calc.bts project
```
will copy the extension to:
```text
project/extensions/calc/calc-1.0.0.bts
```
The target directory and file name come from `manifest.name` and `manifest.version` in the package, not the file name passed in from the command line. Before installing a new version with the same name, the old `-*.bts` under `extensions//` will be deleted to prevent the same project from loading two extension versions with the same name at the same time. The runtime is still compatible with the old `extensions/*.bts` top-level package.
Remote installation command:
```text
bt install sqlite
bt install sqlite 1.0.0
bt install sqlite --project examples/app
```
You can first open the English extension library page `/en/ext` to view the currently installable extensions, versions, permissions and source code addresses.
The remote installation will first read the official website metadata, then download the `.bts` temporary file, verify SHA-256, file size, `manifest.name`, `manifest.version`, `kind` and `abi` in the package and then write it to the project extension directory. When downloading fails, verification fails, or package backend loading fails, half of the `.bts` file will not be left that can be loaded at runtime.
The remote installation output is divided into three steps: download, verification and installation:
```text
Installing sqlite 1.0.0...
[1/3] Downloading
[████████████████████████████████████████] 720.3KB / 720.3KB 100% 1.2MB/s
[2/3] Verifying checksum
✔ sha256 OK
[3/3] Installing
✔ completed
Done.
```
## Code Examples
Complete pure BT expansion process:
```text
bt ext new calc
bt ext build calc -o calc.bts
bt ext check calc.bts
bt ext info calc.bts
bt ext install calc.bts project
bt install sqlite 1.0.0 --project project
```
Post-installation project script call:
```bt
result = calc(1).add(2).value()
// Output: 3
print result
```
## Notes
- `bt ext new` will not overwrite non-empty directories.
- If the output path of `bt ext build` is located in the development directory, the tool will avoid typing the output package into the package again.
- Both `bt ext install` and `bt install` will keep only one version of the extension with the same name in the project.
- The first stage of `bt install` only supports the three-stage version of `major.minor.patch`, and does not support range versions and transitive dependencies.
- The extended CLI command will output the build, installation or check results to the terminal when successful; when it fails, it will output a Chinese error and will not generate a partially loadable `.bts` package.
- The default build has the `extensions` feature enabled and can use `bt ext` directly; `bt ext` and project extension loading are not available only when building the lightweight version with `--no-default-features`.