Skip to content

Instantly share code, notes, and snippets.

@christhekeele
Last active May 21, 2016 19:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save christhekeele/5bbc3ad76bf194adda3f5a822b60b4a4 to your computer and use it in GitHub Desktop.
Save christhekeele/5bbc3ad76bf194adda3f5a822b60b4a4 to your computer and use it in GitHub Desktop.
Local Git Repos for Mix
defmodule MyApp.Mixfile do
use Mix.Project
def project do
[app: :my_app,
version: "0.0.1",
elixir: "~> 1.2",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps]
end
def application do
[applications: [:logger, :slackkit],
mod: {MyApp, [foo: :bar]}]
end
defp remote_deps, do: [
{:slackkit, github: "christhekeele/slackkit", branch: :master},
{:plug, "~> 1.0.2", github: "elixir-lang/plug", tag: "v1.0.2", override: true},
{:ecto, "~> 1.0.0"}
]
defp local_deps, do: [
slackkit: "~/Projects/oss/elixir/slackkit",
plug: "~/Projects/forks/elixir/plug",
]
defp use_local_deps? do
Mix.env != :prod
end
defp deps do
if use_local_deps? do
localizable_deps = Keyword.keys local_deps
remote_deps |> Enum.map( fn dep ->
if elem(dep, 0) in localizable_deps do
localize_dep dep
else
dep
end
end )
else
remote_deps
end
end
defp localize_dep({name, requirement, opts}) do
{ name, requirement, localize_opts(name, opts) }
end
defp localize_dep({name, opts}) when is_list opts do
{ name, localize_opts(name, opts) }
end
defp localize_dep({name, _requirement}) do
bad_local_dep name
end
defp localize_opts(name, opts) do
case validate_opts opts do
:error -> bad_local_dep name
validated_opts ->
[ {:path, Keyword.get(local_deps, name)} | validated_opts ]
end
end
defp validate_opts(opts) when is_list opts do
opts |> Map.new |> validate_opts
end
defp validate_opts(opts = %{git: _, branch: _}) do
opts |> Map.drop([:git, :branch]) |> Keyword.new
end
defp validate_opts(opts = %{git: _, tag: _}) do
opts |> Map.drop([:git, :tag]) |> Keyword.new
end
defp validate_opts(opts = %{git: _, ref: _}) do
opts |> Map.drop([:git, :ref]) |> Keyword.new
end
defp validate_opts(opts = %{github: _, branch: _}) do
opts |> Map.drop([:github, :branch]) |> Keyword.new
end
defp validate_opts(opts = %{github: _, tag: _}) do
opts |> Map.drop([:github, :tag]) |> Keyword.new
end
defp validate_opts(opts = %{github: _, ref: _}) do
opts |> Map.drop([:github, :ref]) |> Keyword.new
end
defp validate_opts(%{}) do
:error
end
defp bad_local_dep(name) do
Mix.raise "Cannot use local dependency for #{name}: local dependencies must specify an scm (git, github) and a ref (tag, branch)"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment