我有一个伞形项目,目前只有一个简单的应用程序依赖于amqp。在本地一切正常,但是当我尝试使用“mix edeliver build release”构建它时,当它试图编译我的代码时,我得到“:AMQP not found”。
当我去构建主机并手动编译应用程序时,它也可以正常工作。我还可以从 edeliver 调试日志中看到,获取依赖项工作得很好。
我怀疑 edeliver 失败了,因为这是一个伞式项目。接下来要在没有雨伞的情况下尝试这个,但我当然想让它与雨伞项目一起工作。
错误如下所示:
编译 2 个文件 (.ex)
== 文件 lib/heartbeat_consumer.ex 上的编译错误 == ** (CompileError) lib/heartbeat_consumer.ex:3: 模块 AMQP 未加载且无法找到 (elixir) 扩展宏:Kernel.use/1 lib/heartbeat_consumer .ex:3: HeartBeatConsumer (module) (elixir) lib/kernel/parallel_compiler.ex:116:匿名 fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
错误 '\n远程命令失败:
builder@buildhost.net
该命令的输出如上所示,在该主机上执行的命令打印在下面以用于调试目的:
退出状态为 1 失败:\n [ -f ~/.profile ] && source ~/.profile set -e cd /tmp/edeliver/myapp/builds if [ "mix" = "rebar" ]; 然后 echo "使用 rebar 编译文件" [[ "" != "true" ]] && ./rebar clean skip_deps=true || : ./rebar 编译 elif [ "mix" = "mix" ] && [ "mix" = "mix" ]; 然后回显“检查是否必须为混合版本 1.3.0 编译 deps”# 参见https://github.com/boldpoker/edeliver/issues/94 如果混合 --version | grep '\''混合 1.3.0'\'' >/dev/null 2>&1 ; 然后 echo "Compiling deps because mix version 1.3.0 is used" APP="abotti_server" MIX_ENV="prod" mix deps.compile fi if [[ "" = "true" ]]; 然后 APP="abotti_server" MIX_ENV="prod" AUTO_VERSION="" SKIP_RELUP_MODIFICATIONS="" RELUP_MODIFICATION_MODULE="" 混合编译否则 APP="abotti_server" MIX_ENV="prod" AUTO_VERSION="" SKIP_RELUP_MODIFICATIONS="" RELUP_MODIFICATION_MODULE="" 混合做干净,编译 fi elif [ "mix" = "mix" ]; 然后 echo "使用 mix 编译文件" if [[ "
我的应用程序 mix.exs 是这样的:
defmodule AbottiServer.Mixfile do
use Mix.Project
def project do
[app: :abotti_server,
version: "0.1.0",
build_path: "../../_build",
config_path: "../../config/config.exs",
deps_path: "../../deps",
lockfile: "../../mix.lock",
elixir: "~> 1.3",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps]
end
# Configuration for the OTP application
#
# Type "mix help compile.app" for more information
def application do
[applications: [:logger, :amqp, :edeliver],
mod: {AbottiServer, []}]
end
# Dependencies can be Hex packages:
#
# {:mydep, "~> 0.3.0"}
#
# Or git/path repositories:
#
# {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
#
# To depend on another app inside the umbrella:
#
# {:myapp, in_umbrella: true}
#
# Type "mix help deps" for more examples and options
defp deps do
[
{:amqp_client, git: "https://github.com/dsrosario/amqp_client.git", branch: "erlang_otp_19", override: true},
{:amqp, "~> 0.1.4"},
{:edeliver, "~> 1.4.0"},
{:distillery, ">= 0.8.0", warn_missing: false}
]
end
end
在与这个问题斗争了一段时间之后,我意识到这里有无数的问题。
- 清理并没有真正起作用,这导致了 :AMQP not found 错误。通过 --skip-mix-clean 开关临时修复。
- 之后,edeliver 抱怨它无法决定是否应该使用 exrm 或 distillery。好的,我确实在伞项目根目录下混合了 release.init 。还将 .deliver 文件夹移至伞形项目的根目录,将 edeliver 和酿酒厂部门添加到根 mix.exs。(我不知道这是否正确)。经过混合发布测试,是的,酿酒厂构建在本地工作。
- 编译仍然无法在构建主机上工作:amqp 无法编译。为使用 amqp 的应用程序添加了 {:amqp_client, git: " https://github.com/dsrosario/amqp_client.git ", branch: "erlang_otp_19", override: true} 到 deps。那行得通,现在编译可以在具有 erlang 19 的构建主机上运行。
- 现在我得到:未能检测到生成的发布版本:/tmp/edeliver/abotti/builds/apps/abotti/rel/abotti/releases/ 我猜这意味着我的 RELEASE_DIR 与我在 .deliver 文件夹中的配置不正确。
好吧,在我完成了 edeliver wiki 所说的为一个伞式项目做的一切之后,总结一下,仍然存在清理和发布目录问题。我只能让 edeliver 使用 --skip-mix-clean 进行编译,并且我已经尝试了对 RELEASE_DIR 的许多调整,但我总是得到“未能检测到发布版本错误”。
任何帮助将非常感激。