summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@dashbit.co>2022-05-11 13:19:36 +0200
committerJosé Valim <jose.valim@dashbit.co>2022-05-11 13:19:38 +0200
commitcef851638ce2ae46fa8f3be810140b423d040c59 (patch)
tree4768677b2726d9f2f4491465061ca45a4b2b54d8
parentd994415ac84fd007797d48aaed853a96a03e2023 (diff)
downloadelixir-cef851638ce2ae46fa8f3be810140b423d040c59.tar.gz
Add --no-optional-deps to skip optional dependencies for compilation testing
Closes #11798.
-rw-r--r--lib/mix/lib/mix/tasks/compile.elixir.ex2
-rw-r--r--lib/mix/lib/mix/tasks/compile.ex3
-rw-r--r--lib/mix/lib/mix/tasks/deps.loadpaths.ex9
-rw-r--r--lib/mix/lib/mix/tasks/loadpaths.ex1
-rw-r--r--lib/mix/test/mix/tasks/compile.elixir_test.exs37
5 files changed, 51 insertions, 1 deletions
diff --git a/lib/mix/lib/mix/tasks/compile.elixir.ex b/lib/mix/lib/mix/tasks/compile.elixir.ex
index 903017f00..3922dbc32 100644
--- a/lib/mix/lib/mix/tasks/compile.elixir.ex
+++ b/lib/mix/lib/mix/tasks/compile.elixir.ex
@@ -103,7 +103,7 @@ defmodule Mix.Tasks.Compile.Elixir do
manifest = manifest()
base = xref_exclude_opts(project[:elixirc_options] || [], project)
- cache_key = {base, srcs}
+ cache_key = {base, srcs, "--no-optional-deps" in args}
opts =
base
diff --git a/lib/mix/lib/mix/tasks/compile.ex b/lib/mix/lib/mix/tasks/compile.ex
index 46c41f8e3..2cbb05241 100644
--- a/lib/mix/lib/mix/tasks/compile.ex
+++ b/lib/mix/lib/mix/tasks/compile.ex
@@ -54,6 +54,9 @@ defmodule Mix.Tasks.Compile do
* `--no-compile` - does not actually compile, only loads code and perform checks
* `--no-deps-check` - skips checking of dependencies
* `--no-elixir-version-check` - does not check Elixir version
+ * `--no-optional-deps` - does not compile or load optional deps. Useful for testing
+ if a library still successfully compiles without optional dependencies (which is the
+ default case with dependencies)
* `--no-protocol-consolidation` - skips protocol consolidation
* `--no-validate-compile-env` - does not validate the application compile environment
* `--return-errors` - returns error status and diagnostics instead of exiting on error
diff --git a/lib/mix/lib/mix/tasks/deps.loadpaths.ex b/lib/mix/lib/mix/tasks/deps.loadpaths.ex
index 9db870d3e..eb30eb9ae 100644
--- a/lib/mix/lib/mix/tasks/deps.loadpaths.ex
+++ b/lib/mix/lib/mix/tasks/deps.loadpaths.ex
@@ -18,12 +18,21 @@ defmodule Mix.Tasks.Deps.Loadpaths do
* `--no-deps-check` - does not check or compile deps, only load available ones
* `--no-elixir-version-check` - does not check Elixir version
* `--no-load-deps` - does not add deps loadpaths to the code path
+ * `--no-optional-deps` - does not compile or load optional deps
"""
@impl true
def run(args) do
all = Mix.Dep.load_and_cache()
+
+ all =
+ if "--no-optional-deps" in args do
+ for dep <- all, dep.opts[:optional] != true, do: dep
+ else
+ all
+ end
+
config = Mix.Project.config()
unless "--no-elixir-version-check" in args do
diff --git a/lib/mix/lib/mix/tasks/loadpaths.ex b/lib/mix/lib/mix/tasks/loadpaths.ex
index 303f8b987..dd64d3b2a 100644
--- a/lib/mix/lib/mix/tasks/loadpaths.ex
+++ b/lib/mix/lib/mix/tasks/loadpaths.ex
@@ -22,6 +22,7 @@ defmodule Mix.Tasks.Loadpaths do
* `--no-deps-check` - does not check dependencies, only load available ones
* `--no-elixir-version-check` - does not check Elixir version
* `--no-load-deps` - does not add deps loadpaths to the code path
+ * `--no-optional-deps` - does not compile or load optional deps
"""
@impl true
diff --git a/lib/mix/test/mix/tasks/compile.elixir_test.exs b/lib/mix/test/mix/tasks/compile.elixir_test.exs
index 9bc5b948d..a2258f11c 100644
--- a/lib/mix/test/mix/tasks/compile.elixir_test.exs
+++ b/lib/mix/test/mix/tasks/compile.elixir_test.exs
@@ -1494,4 +1494,41 @@ defmodule Mix.Tasks.Compile.ElixirTest do
refute_received {:mix_shell, :info, ["Compiled lib/c.ex"]}
end)
end
+
+ defmodule GitApp do
+ def project do
+ [
+ app: :git_app,
+ version: "0.1.0",
+ deps: [
+ {:git_repo, "0.1.0", git: fixture_path("git_repo"), optional: true}
+ ]
+ ]
+ end
+ end
+
+ test "compiles without optional dependencies" do
+ in_fixture("no_mixfile", fn ->
+ Mix.Project.push(GitApp)
+
+ File.write!("lib/a.ex", """
+ defmodule A do
+ def hello, do: GitRepo.hello()
+ end
+ """)
+
+ assert capture_io(:stderr, fn ->
+ Mix.Tasks.Compile.run(["--no-optional-deps"]) == :ok
+ end) =~ "GitRepo.hello/0 is undefined"
+ end)
+ end
+
+ test "recompiles if --no-optional-deps change" do
+ in_fixture("no_mixfile", fn ->
+ Mix.Project.push(MixTest.Case.Sample)
+ assert Mix.Tasks.Compile.Elixir.run([]) == {:ok, []}
+ assert Mix.Tasks.Compile.Elixir.run([]) == {:noop, []}
+ assert Mix.Tasks.Compile.Elixir.run(["--no-optional-deps"]) == {:ok, []}
+ end)
+ end
end