Elixir - 库依赖项之间的死锁

标签 elixir phoenix-framework

上下文

我正在使用 Tirexs 包构建自己的代码库来处理 ElasticSearch。这是我第一次深入研究 Elixir 提供的宏、依赖项、使用、导入和其他几个最高级的功能。

为此,我定义了一个 Document 结构,大致如下所示,(/lib/data/document.ex)

defmodule Document do
  use Document.ORM
  import Document.Builder, only: [build_document: 2]
  import Document.Builder.Validations, only: [is_document_valid?: 1, collect_errors: 1]

  defstruct [valid?: false, errors: nil, fields: %{}]

  def something do
    # uses imported functions from Document.Builder and Documen.Builder.Validations
  end
end

Document 模块随后使用了 Document.ORM 模块中的其他几个函数,这些函数似乎不是错误的原因。

问题

我的错误如下

Compilation failed because of a deadlock between files.
dataobj_1          | The following files depended on the following modules:
dataobj_1          | 
dataobj_1          |   web/controllers/document_controller.ex => Document
dataobj_1          |             lib/data/document/builder.ex => Document.Builder.AuxiliarBuilder
dataobj_1          |                     lib/data/document.ex => Document.Builder
dataobj_1          |      lib/data/document/orm/bulk/utils.ex => Document
dataobj_1          |    lib/data/document/builder/auxiliar.ex => Document

有一个我不知道如何处理的死锁,我确定我做错了什么。

第一个依赖项,document_controller 出现(我认为)因为它都引用模块 Document%不同地方的文档结构:

defmodule Data.DocumentController do
  use Data.Web, :controller

  def create(conn, %{"document" => document_params}) do
      {:ok, doc} = document_params 
        |> Document.new
      case Document.save(doc) do
        {:ok, record} ->
          conn
          |> put_status(201)
          |> render(Data.DocumentView, "document.json", payload: Document.find(record._id))
        {:error, map_of_errors} ->
          conn
          |> put_status(422)
          |> render(Data.ErrorView, "422.json", errors: map_of_errors)
      end
  end
  def update(conn, %{"id" => id, "document" => document}) do
    case Document.update(id, document) do
      %Document{valid?: false, errors: errors} ->
        conn
        |> put_status(422)
        |> render(Data.ErrorView, "422.json", errors: errors)
      docset ->
        conn
        |> put_status(200)
        |> render(Data.DocumentView, "update.json", payload: docset)
    end
  end

其他依赖项也同时引用模块和结构,所以我认为死锁与此有关。但我不知道该怎么做。

如果有必要,我可以分享更多代码,但开始这个问题我认为已经足够了。

提前致谢!

最佳答案

你有循环依赖。

Document -> Document.Builder -> Document.AuxiliarBuilder -> Document

一般来说,您应该避免子模块(Document.BuilderDocument.AuxiliarBuilder)调用它们的父模块(Document)。听起来您需要从 Document 中提取这些函数并将它们放在其他地方。

注意:Elixir 实际上没有父子模块的概念。我只是在这里使用这些词,因为这就是我的想法。

关于Elixir - 库依赖项之间的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49393712/

相关文章:

functional-programming - 如何在Elixir中重写Erlang组合算法?

elixir - 基于 Ecto 关联查询

elixir - dialyzer 无法识别 elixir 函数,错误为 :0:unknown_function

elixir - 在phoenix框架(elixir)中更改Url以接受字符串而不是id

elixir - `mix ecto.rollback` 和 `mix ecto.migrate` 命令的调试级别日志记录

macos - 运行 mix ecto.create 命令在 Phoenix 项目中创建数据库,并使用brew安装的 postgresql

npm - Phoenix 框架 - 在子目录中执行 NPM 脚本

elixir - Phoenix Framework 1.4 版本中的 models 文件夹在哪里?

node.js - 使用phoenix_api_docs