README.md

# Cmder

Mix tasks for installing and invoking [cmder](https://gitlab.com/schutm/cmder/).
The raison d'etre for this module is to prevent zombies.


## Installation

If you are going to run commands in production, then you add
`cmder` as dependency on all environments but only start it
in dev:

```elixir
def deps do
  [
    {:cmder, "~> 0.0.2", runtime: Mix.env() == :dev}
  ]
end
```

However, if you run commands only during development,
then it only needs to be a dev dependency:

```elixir
def deps do
  [
    {:cmder, "~> 0.0.2", only: :dev}
  ]
end
```

## Profiles

The first argument to `cmder` is an execution profile.
You can define multiple execution profiles with the current
directory, the OS environment, and default arguments to the
`cmder` task:

```elixir
config :cmder,
  tailwindcss: [
    args: ~w(--input=css/app.css --output=../priv/static/assets/app.css --postcss),
    cd: Path.expand("../assets", __DIR__)
  ]
```

When `mix cmder tailwindcss` is invoked, the task arguments will be appended
to the ones configured above. Note profiles must be configured in your
`config/config.exs`, as `cmder` runs without starting your application
(and therefore it won't pick settings in `config/runtime.exs`).

## Adding to Phoenix

To add `cmder` to an application using Phoenix, you need only four steps.
Installation requires that Phoenix watchers can accept module-function-args
as possible since Phoenix 1.6.0.

First add it as a dependency in your `mix.exs`:

```elixir
def deps do
  [
    {:phoenix, "~> 1.6.0"},
    {:cmder, "~> 0.0.2", runtime: Mix.env() == :dev}
  ]
end
```

Now let's change `config/config.exs` to configure `cmder` to list the
file contents of the `priv/static/assets` directory:

```elixir
config :cmder,
  tailwindcss: [
    path: Path.expand("../assets/node_modules/.bin", __DIR__),
    args: ~w(--input=css/app.css --output=../priv/static/assets/app.css --postcss),
    cd: Path.expand("../assets", __DIR__)
  ],
  cpx: [
    prevent_zombie: true,
    path: Path.expand("../assets/node_modules/.bin", __DIR__),
    args: ~w(static/**/* ../priv/static),
    cd: Path.expand("../assets", __DIR__)
  ]
```

> Make sure the "assets" directory from priv/static is listed in the
> :only option for Plug.Static in your lib/my_app_web/endpoint.ex

For development, we want to enable watch mode. So find the `watchers`
configuration in your `config/dev.exs` and add:

```elixir
  cmder: {Cmder, :run, [:tailwindcss, ~w(--watch)]}
```

## License

Original based on [esbuild|https://github.com/phoenixframework/esbuild] which is
    Copyright (c) 2021 Wojtek Mach, José Valim.

cmder source code is licensed under the [MIT License](LICENSE.md).