CeamKrier
CeamKrier

Reputation: 839

Deno: How to substitute npm scripts (package.json)

Since it is not necessary to have package.json file with deno, how can I as a developer have a similar experience just as we have with npm scripts in package.json?

Upvotes: 15

Views: 5228

Answers (5)

Matias Kinnunen
Matias Kinnunen

Reputation: 8540

Deno has a built-in Task Runner since v1.20 (released Mar 17, 2022).

From the docs (as of Oct 16, 2023):

Task Runner

deno task provides a cross platform way to define and execute custom commands specific to a codebase.

To get started, define your commands in your codebase's Deno configuration file under a "tasks" key.

For example:

{
  "tasks": {
    "data": "deno task collect && deno task analyze",
    "collect": "deno run --allow-read=. --allow-write=. scripts/collect.js",
    "analyze": "deno run --allow-read=. scripts/analyze.js"
  }
}

Listing tasks

To get an output showing all the defined tasks, run:

deno task

Executing a task

To execute a specific task, run:

deno task task-name [additional args]...

In the example above, to run the data task we would do:

deno task data

More details in the Task Runner docs. (This link points to the latest version's docs.)

Upvotes: 5

ford04
ford04

Reputation: 74590

deno install

You can create executable, aliased scripts with deno install.

It will provide a thin shell/cmd wrapper for the specified main module and CLI arguments. Example:

deno install --root . -n serve --allow-read --allow-net https://deno.land/[email protected]/http/file_server.ts

The result is a serve script, similar to npm "scripts": { "serve": ... }:

./bin/serve # run `serve` script (~ npm run serve)

If the project's bin folder is added to PATH environment, the command shortens up to serve.

What deno install does

  • creates bin folder, if not existent
  • adds serve/serve.cmd file with following content (Windows here):
    % generated by deno install %
    

@deno.exe "run" "--allow-read" "--allow-net" "https://deno.land/[email protected]/http/file_server.ts" %* ```

  • -n is the command name used later on (can be left out)
  • --root specifies the bin root location (otherwise ~/.deno)
  • -f option overwrites an existent alias

Side note: Any .js/.ts script is a valid reference - source code location (local/URL) does not matter. If external shell scripts are to be included, you can also run them inside a subprocess.

Example: Custom npm run build

// ./scripts/build.ts

// create subprocess
const p = Deno.run({
  cmd: ["deno", "cache", "-r", "--unstable", "main.ts"],
});

await p.status();
deno install --root . --allow-run scripts\build.ts

./bin/build # execute build script

Built-in deno commands

Deno already comes with built-in solutions for common ecosystem tasks, e.g. bundle, fmt, test and lint later on (see deno help). You can invoke these commands directly - no need to define custom scripts:

deno test
deno fmt
deno cache -r main.ts # similar to `npm run build` / `tsc`
# ...

Upvotes: 7

Umbo
Umbo

Reputation: 3142

velociraptor may be of help, especially if you want to run arbitrary shell scripts.

It accepts yaml, json and ts script configuration files. The following example illustrates the main features:

# scripts.yaml
scripts:

  start: deno run server.ts # Scripts can be simple command strings

  opts:                     # Or objects
    cmd: deno run server.ts
    desc: Starts the server
    tsconfig: tsconfig.json # Deno cli options
    imap: importmap.json
    allow:
      - read
      - net
    env:                    # Env vars
      PORT: 8080

  compact: server.ts        # `deno run` is automatically prepended
                            # when the script starts with a .ts file

  multiple:                 # Lists of commands are executed in series
    - echo one
    - echo two

  concurrent:               # Use the pll property to declare
    pll:                    # concurrent scripts
      - echo one
      - echo two

env:                        # Top level options are sent to all the scripts
  PORT: 3000
allow:
  - write

Run vr without arguments to see a list of available scripts. To execute a script run:

$ vr <script name> [additional args]...
# or
$ vr run <script name> [additional args]...
# Additional args are passed to the script

ie

vr start

Disclaimer: I'm the author

Upvotes: 9

lokesh
lokesh

Reputation: 343

You can create your own files as denoDept.js

export { assert } from "https://deno.land/[email protected]/testing/asserts.ts";
export { green, bold } from "https://deno.land/[email protected]/fmt/colors.ts";

And you can add all your dependencies in a single file and use it so it will look like package manager.

Upvotes: 1

BentoumiTech
BentoumiTech

Reputation: 1683

I've been working on a solution that mimics the package.json scripts sections while adding some Deno specific functionalities.

You need first to install denox you can find the instructions here https://github.com/BentoumiTech/denox

Then create a .deno-workspace file where you specify your scripts list :

scripts:
  # "denox run start" will execute main.ts with example.com networking permissions
  start:
    file: main.ts
    permissions:
      allow-net: example.com
  # "denox run develop" will execute main.ts with localhost networking permissions
  develop:
    file: main.ts
    permissions:
      allow-net: localhost

You can then run

  1. $ denox run start
  2. $ denox run develop

Upvotes: 6

Related Questions