defmodule Phoenix.Copy do
@moduledoc """
Copy static assets for your Phoenix app during development and deployment.
For more information, see the [README](readme.html).
## Direct Usage
To copy files once, use `run/1` with the name of the configured profile:
run(:default)
To watch for changes and continually copy files, use `watch/1`:
watch(:default)
Note that `watch/1` will block execution.
"""
@doc """
Returns the configuration of the given `profile`.
"""
@spec config_for!(atom) :: Keyword.t()
def config_for!(profile) when is_atom(profile) do
Application.get_env(:phoenix_copy, profile) ||
raise ArgumentError, """
unknown copy profile. Make sure the profile is defined in your config/config.exs file, such as:
config :phoenix_copy,
#{profile}: [
source: Path.expand("../assets/static", __DIR__),
destination: Path.expand("../priv/static", __DIR__)
]
"""
end
@doc """
Copies files from the configured source and destination for the given `profile`.
Returns a list of copied files.
"""
@spec run(atom) :: [binary]
def run(profile \\ :default)
def run(profile) when is_atom(profile) do
config = config_for!(profile)
source = Keyword.fetch!(config, :source)
destination = Keyword.fetch!(config, :destination)
File.cp_r!(source, destination)
end
@doc """
Watch for changes in the configured `source` and copy files to the `destination`.
Also performs an initial copy of the files immediately. Note that this function blocks execution
until the process receives an exit signal.
"""
@spec watch(atom) :: term
def watch(profile \\ :default)
def watch(profile) when is_atom(profile) do
run(profile)
config = config_for!(profile)
source = Keyword.fetch!(config, :source)
destination = Keyword.fetch!(config, :destination)
Phoenix.Copy.Watcher.watch(source, destination)
end
end