# `Mix.Generator`
[🔗](https://github.com/elixir-lang/elixir/blob/v1.20.5/lib/mix/lib/mix/generator.ex#L5)

Conveniences for working with paths and generating content.

# `generator_opts`

```elixir
@type generator_opts() :: [
  force: boolean(),
  quiet: boolean(),
  format_elixir: boolean()
]
```

# `copy_file`
*since 1.9.0* 

```elixir
@spec copy_file(Path.t(), Path.t(), generator_opts()) :: boolean()
```

Copies `source` to `target`.

If `target` already exists and the contents are not the same,
it asks for user confirmation.

## Options

  * `:force` - forces copying without a shell prompt
  * `:quiet` - does not log command output
  * `:format_elixir` (since v1.18.0) - if `true`, apply formatter to the generated file

## Examples

    iex> Mix.Generator.copy_file("source/gitignore", ".gitignore")
    * creating .gitignore
    true

# `copy_template`
*since 1.9.0* 

```elixir
@spec copy_template(Path.t(), Path.t(), keyword(), generator_opts()) :: boolean()
```

Evaluates and copy templates at `source` to `target`.

The template in `source` is evaluated with the given `assigns`.

If `target` already exists and the contents are not the same,
it asks for user confirmation.

## Options

  * `:force` - forces copying without a shell prompt
  * `:quiet` - does not log command output
  * `:format_elixir` (since v1.18.0) - if `true`, apply formatter to the generated file

## Examples

    iex> assigns = [project_path: "/Users/joe/newproject"]
    iex> Mix.Generator.copy_template("source/gitignore", ".gitignore", assigns)
    * creating .gitignore
    true

# `create_directory`

```elixir
@spec create_directory(Path.t(), [{:quiet, boolean()}]) :: true
```

Creates a directory if one does not exist yet.

This function does nothing if the given directory already exists; in this
case, it still logs the directory creation.

## Options

  * `:quiet` - does not log command output

## Examples

    iex> Mix.Generator.create_directory("path/to/dir")
    * creating path/to/dir
    true

# `create_file`

```elixir
@spec create_file(Path.t(), iodata(), generator_opts()) :: boolean()
```

Creates a file with the given contents.

If the file already exists and the contents are not the same,
it asks for user confirmation.

## Options

  * `:force` - forces creation without a shell prompt
  * `:quiet` - does not log command output
  * `:format_elixir` (since v1.18.0) - if `true`, apply formatter to the generated file

## Examples

    iex> Mix.Generator.create_file(".gitignore", "_build\ndeps\n")
    * creating .gitignore
    true

# `embed_template`
*macro* 

Embeds a template given by `contents` into the current module.

It will define a private function with the `name` followed by
`_template` that expects assigns as arguments.

This function must be invoked passing a keyword list.
Each key in the keyword list can be accessed in the
template using the `@` macro.

For more information, check `EEx.SmartEngine`.

## Examples

    defmodule Mix.Tasks.MyTask do
      require Mix.Generator
      Mix.Generator.embed_template(:log, "Log: <%= @log %>")
    end

# `embed_text`
*macro* 

Embeds a text given by `contents` into the current module.

It will define a private function with the `name` followed by
`_text` that expects no arguments.

## Examples

    defmodule Mix.Tasks.MyTask do
      require Mix.Generator
      Mix.Generator.embed_text(:error, "There was an error!")
    end

# `overwrite?`
*since 1.9.0* 

```elixir
@spec overwrite?(Path.t()) :: boolean()
```

Prompts the user to overwrite the file if it exists.

Returns `false` if the file exists and the user forbade
to override it. Returns `true` otherwise.

# `overwrite?`
*since 1.9.0* 

```elixir
@spec overwrite?(Path.t(), iodata()) :: boolean()
```

Prompts the user to overwrite the file if it exists.

The contents are compared to avoid asking the user to
override if the contents did not change. Returns `false`
if the file exists and the content is the same or the
user forbade to override it. Returns `true` otherwise.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
