[英]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.Builder
, Document.AuxiliarBuilder
)調用其父模塊( Document
)。 聽起來您需要從Document
提取這些功能並將其放在其他位置。
注意 :Elixir實際上沒有父級和子級模塊的概念。 我只是在這里使用這些詞,因為這就是我的想法。
顯然,由於結構的定義(即%Document
)和模塊名稱的混淆,發生了循環依賴。
將結構定義移動到其自己的單獨文件中( 此處的前兩行是提示),並將模塊名稱從Document
更改為Data.Document
( %Data.Document
)就足以解決所有循環依賴性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.