0

我有一个伞形项目,目前只有一个简单的应用程序依赖于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

在与这个问题斗争了一段时间之后,我意识到这里有无数的问题。

  1. 清理并没有真正起作用,这导致了 :AMQP not found 错误。通过 --skip-mix-clean 开关临时修复。
  2. 之后,edeliver 抱怨它无法决定是否应该使用 exrm 或 distillery。好的,我确实在伞项目根目录下混合了 release.init 。还将 .deliver 文件夹移至伞形项目的根目录,将 edeliver 和酿酒厂部门添加到根 mix.exs。(我不知道这是否正确)。经过混合发布测试,是的,酿酒厂构建在本地工作。
  3. 编译仍然无法在构建主机上工作:amqp 无法编译。为使用 amqp 的应用程序添加了 {:amqp_client, git: " https://github.com/dsrosario/amqp_client.git ", branch: "erlang_otp_19", override: true} 到 deps。那行得通,现在编译可以在具有 erlang 19 的构建主机上运行。
  4. 现在我得到:未能检测到生成的发布版本:/tmp/edeliver/abotti/builds/apps/abotti/rel/abotti/releases/ 我猜这意味着我的 RELEASE_DIR 与我在 .deliver 文件夹中的配置不正确。

好吧,在我完成了 edeliver wiki 所说的为一个伞式项目做的一切之后,总结一下仍然存在清理和发布目录问题。我只能让 edeliver 使用 --skip-mix-clean 进行编译,并且我已经尝试了对 RELEASE_DIR 的许多调整,但我总是得到“未能检测到发布版本错误”。

任何帮助将非常感激。

4

0 回答 0