非常教程

Elixir 1.5参考手册

Mix

Mix.Project

定义和操作Mix项目。

Mix项目通过调用use Mix.Project模块来定义,通常放置在mix.exs

defmodule MyApp.Mixfile do
  use Mix.Project

  def project do
    [
      app: :my_app,
      version: "1.0.0"
    ]
  end
end

配置

为了配置混合,该模块use小号Mix.Project要导出project/0,返回表示该项目配置的关键字列表功能。

这个配置可以使用读取Mix.Project.config/0。请注意,config/0如果项目未定义,则不会失败; 这允许许多Mix任务在没有项目的情况下工作。

如果任务需要定义项目或需要访问项目中的特殊功能,则在没有定义项目的情况下,任务可以调用Mix.Project.get!/0失败Mix.NoProjectError

没有可以返回的所有选项的全面列表,project/0因为许多Mix任务定义了他们从此配置读取的选项。例如,查看Mix.Tasks.Compile任务文档中的“配置”部分。

这些只是一个Mix任务不使用的几个选项(因此将在这里进行记录):

  • :build_per_environment- 如果true,构建将是每个环境。如果无论Mix环境如何false,构建都会进入_build/shared。默认为true
  • :aliases - 任务别名列表。有关更多信息,请查看Mix模块文档中的“别名”部分。默认为[]
  • :config_path - 表示主配置文件路径的字符串。查看config_files/0更多信息。默认为"config/config.exs"
  • :default_task- 表示mix未指定任务时要运行的默认任务的字符串。默认为"run"
  • :deps - 这个项目的依赖列表。Mix.Tasks.Deps有关更多信息,请参阅该任务的文档。默认为[]
  • :deps_path - 存储依赖关系的目录。另见deps_path/1。默认为"deps"
  • :lockfile- mix deps.*任务族使用的锁文件的名称。默认为"mix.lock"
  • :preferred_cli_env- {task, env}元组的关键字列表,其中task是作为原子的任务名称(例如:"deps.get"),并且env是首选环境(例如:test)。此选项将覆盖具有该@preferred_cli_env属性的任务指定的内容(请参阅文档Mix.Task)。默认为[]

有关更多选项,请留意单个Mix任务的文档; 好的例子是Mix.Tasks.Compile任务和所有特定的编译任务(比如Mix.Tasks.Compile.ElixirMix.Tasks.Compile.Erlang)。

请注意,有时在文档中提到了针对不同任务的相同配置选项; 这只是因为它很常见的许多任务阅读和使用相同的配置选项(例如,:erlc_paths所使用的mix compile.erlangmix compile.yecc和其他任务)。

Erlang项目

Mix可以用来管理没有任何Elixir代码的Erlang项目。为了确保Mix任务对Erlang项目正常工作,language: :erlang必须是返回的配置的一部分project/0。此设置还可以确保Elixir不会作为依赖项添加到生成的.app文件或生成的escript中mix escript.build,依此类推。

功能

app_path(config \ config())

返回生成中的应用程序路径。

apps_paths(config \ config())

返回带伞子应用程序路径的映射。

build_path(config \ config())

返回给定项目的生成路径。

build_structure(config \ config(), opts \ [])

为给定的应用程序构建项目结构。

compile(args, config \ [])

编译给定的项目。

compile_path(config \ config())

返回给定项目编译到的路径。

config()

返回项目配置。

config_files()

返回此项目的项目配置文件列表。

consolidation_path(config \ config())

返回存储协议合并的路径。

deps_path(config \ config())

返回存储给定项目的依赖项的路径。

deps_paths()

以映射的形式返回所有依赖项的完整路径。

ensure_structure(config \ config(), opts \ [])

确保给定项目的项目结构存在。

get()

如果有当前项目,则检索当前项目。

get!()

get/0,但如果没有当前项目,则会引发异常。

in_project(app, path, post_config \ [], fun)

运行给定的fun在给定的项目中

load_paths(config \ config())

返回给定项目的所有加载路径。

manifest_path(config \ config())

返回存储清单的路径。

umbrella?(config \ config())

如果config是伞项目的配置,则返回true

app_path(config \ config())

app_path(keyword) :: Path.t

返回生成中的应用程序路径。

返回的路径将被展开。

实例

Mix.Project.app_path
#=> "/path/to/project/_build/shared/lib/app"

apps_paths(config \ config())

返回带伞子应用程序路径的映射。

这些路径基于:apps_path:apps配置。

如果给定的项目配置标识雨伞项目,返回值是地图上app => path哪里app是伞的孩子应用程序,path是其路径相对于伞项目的根。

如果给定的项目配置没有标识伞式项目,nil会被归还。

实例

Mix.Project.apps_paths()
#=> %{my_app1: "apps/my_app1", my_app2: "apps/my_app2"}

build_path(config \ config())

build_path(keyword) :: Path.t

返回给定项目的生成路径。

如果未给出配置,则使用当前项目的配置。

返回的路径将被展开。

实例

Mix.Project.build_path
#=> "/path/to/project/_build/shared"

如果:build_per_environment设置为true,它将为每个环境创建一个新的构建:

Mix.env
#=> :dev
Mix.Project.build_path
#=> "/path/to/project/_build/dev"

build_path(config \ config())

build_structure(keyword, keyword) :: :ok

为给定的应用程序构建项目结构。

备选方案

  • :symlink_ebin-符号链接Ebin而不是复制它

compile(args, config \ [])

compile([term], keyword) :: term

编译给定的项目。

compile_path(config \ config())

compile_path(keyword) :: Path.t

返回给定项目编译到的路径。

如果未给出配置,则将使用当前项目的配置。

返回的路径将被展开。

实例

Mix.Project.compile_path
#=> "/path/to/project/_build/dev/lib/app/ebin"

config()

config() :: keyword

返回项目配置。

如果没有定义项目,它仍会返回一个带有默认值的关键字列表。这使得许多Mix任务可以工作,而不需要基础项目。

注意,一旦将项目推送到堆栈上,此配置将被缓存。多次调用它不会导致重新计算它。

不要Mix.Project.config/0用来查找运行时配置。仅将它用于配置项目的各个方面(如编译目录),而不是您的应用程序运行时。

config_files()

config_files() :: [Path.t]

返回此项目的项目配置文件列表。

此函数通常用于编译任务,以便每当此类配置文件更改时触发完全重新编译。

它返回mix.exs文件,锁清单以及config目录中所有不以尾部句号开头的配置文件(例如,.my_config.exs)。

consolidation_path(config \ config())

返回存储协议合并的路径。

返回的路径将被展开。

实例

Mix.Project.consolidation_path
#=> "/path/to/project/_build/dev/lib/my_app/consolidated"

雨伞内:

Mix.Project.consolidation_path
#=> "/path/to/project/_build/dev/consolidated"

deps_path(config \ config())

deps_path(keyword) :: Path.t

返回存储给定项目的依赖项的路径。

如果未给出配置,则使用当前项目的配置。

返回的路径将被展开。

实例

Mix.Project.deps_path
#=> "/path/to/project/deps"

deps_paths()

deps_paths() :: %{optional(atom) => Path.t}

将所有依赖项的完整路径作为映射返回。

实例

Mix.Project.deps_paths
#=> %{foo: "deps/foo", bar: "custom/path/dep"}

ensure_structure(config \ config(), opts \ [])

ensure_structure(keyword, keyword) :: :ok

确保给定项目的项目结构存在。

如果它真的存在的话,它是不存在的。否则,它就是建造的。

get()

get() :: module | nil

检索当前项目(如果有)。

如果没有当前的项目,nil会被归还。在当前目录中没有混合文件的情况下可能会发生这种情况。

如果您希望定义一个项目,即它是当前任务的一个要求,则应该调用get!/0相反。

get!()

get!() :: module | no_return

与之相同get/0,但在没有当前项目的情况下引发异常。

这通常由需要定义项目的附加功能的任务调用。由于这些任务通常依赖于定义的项目,因此Mix.NoProjectError如果没有项目可用,此功能会引发异常。

in_project(app, path, post_config \ [], fun)

in_project(atom, Path.t, keyword, (module -> result)) :: result when result: term

运行给定的fun在给定的项目中。

此函数更改当前工作目录,并将给定目录下的项目加载到项目堆栈中。

post_config可以通过将被合并到项目配置中。

fun用给定的模块名称调用Mix.Project。这个函数的返回值是返回值fun

实例

Mix.Project.in_project :my_app, "/path/to/my_app", fn module ->
  "Mixfile is: #{inspect module}"
end
#=> "Mixfile is: MyApp.Mixfile"

load_paths(config \ config())

load_paths(keyword) :: [Path.t]

返回给定项目的所有加载路径。

manifest_path(config \ config())

manifest_path(keyword) :: Path.t

返回存储清单的路径。

默认情况下,它们存储在构建目录内的app路径中。伞式应用程序将清单路径设置为构建目录的根目录。目录可能在以后的版本中被更改。

返回的路径将被展开。

实例

Mix.Project.manifest_path
#=> "/path/to/project/_build/shared/lib/app"

umbrella?(config \ config())

如果config是伞项目的配置,则返回true

当没有参数调用时,告诉当前项目是否是一个综合项目。

Elixir 1.5

Elixir 基于 Erlang 虚拟机的函数式、面向并行,是一种较好的编程语言。它以 Erlang 为基础,支持分布式、高容错、实时应用程序的开发。

主页 https://elixir-lang.org/
源码 https://github.com/elixir-lang/elixir
版本 1.5
发布版本 1.5.2