gpt4 book ai didi

Elixir - 库依赖项之间的死锁

转载 作者:行者123 更新时间:2023-12-01 10:22:40 26 4
gpt4 key购买 nike

上下文

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com