Script installer
Deno provides deno install
to easily install and distribute executable code.
deno install [OPTIONS...] [URL] [SCRIPT_ARGS...]
will install the script
available at URL
under the name EXE_NAME
.
This command creates a thin, executable shell script which invokes deno
using
the specified CLI flags and main module. It is placed in the installation root’s
bin
directory.
Example:
$ deno install --allow-net --allow-read https://deno.land/std@$STD_VERSION/http/file_server.ts
[1/1] Compiling https://deno.land/std@$STD_VERSION/http/file_server.ts
✅ Successfully installed file_server.
/Users/deno/.deno/bin/file_server
To change the executable name, use -n
/--name
:
deno install --allow-net --allow-read -n serve https://deno.land/std@$STD_VERSION/http/file_server.ts
The executable name is inferred by default:
- Attempt to take the file stem of the URL path. The above example would become ‘file_server’.
- If the file stem is something generic like ‘main’, ‘mod’, ‘index’ or ‘cli’, and the path has no parent, take the file name of the parent path. Otherwise settle with the generic name.
- If the resulting name has an ‘@…’ suffix, strip it.
To change the installation root, use --root
:
deno install --allow-net --allow-read --root /usr/local https://deno.land/std@$STD_VERSION/http/file_server.ts
The installation root is determined, in order of precedence:
--root
optionDENO_INSTALL_ROOT
environment variable$HOME/.deno
These must be added to the path manually if required.
echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.bashrc
You must specify permissions that will be used to run the script at installation time.
deno install --allow-net --allow-read https://deno.land/std@$STD_VERSION/http/file_server.ts -p 8080
The above command creates an executable called file_server
that runs with
network and read permissions and binds to port 8080.
For good practice, use the import.meta.main
idiom to specify the entry point in an executable script.
Example:
// https://example.com/awesome/cli.ts
async function myAwesomeCli(): Promise<void> {
-- snip --
}
if (import.meta.main) {
myAwesomeCli();
}
When you create an executable script make sure to let users know by adding an example installation command to your repository:
# Install using deno install
$ deno install -n awesome_cli https://example.com/awesome/cli.ts