簡體   English   中英

Elixir-庫依賴關系之間的死鎖

[英]Elixir - Deadlock between library dependencies

上下文

我正在使用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%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實際上沒有父級和子級模塊的概念。 我只是在這里使用這些詞,因為這就是我的想法。

顯然,由於結構的定義(即%Document )和模塊名稱的混淆,發生了循環依賴。

將結構定義移動到其自己的單獨文件中( 此處的前兩行是提示),並將模塊名稱從Document更改為Data.Document%Data.Document )就足以解決所有循環依賴性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM