Edeliver/Distillery 因“bash: line 10: mix: command not found”错误而失败?

Mas*_*son 4 elixir phoenix-framework edeliver distillery

运行时出现此错误 mix edeliver build release production --verbose

A remote command failed on:
  deploy@80.111.111.80
Run Code Online (Sandbox Code Playgroud)

但是当我登录服务器时,Elixir(以及 Mix)似乎安装得很好。

ssh deploy@80.111.111.80
deploy@80.111.111.80:~$ mix -v
Erlang/OTP 20 [erts-9.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Mix 1.5.0
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常。Edeliver 在查找 Elixir 安装时遇到问题是什么?我使用 asdf 版本管理器安装 Elixir 和 Erlang。

小智 8

. $HOME/.asdf/asdf.sh在我的~/.profile.


Fla*_*nix 6

也许是asdf?

我已经安装了 Elixir 和 Erlang asdf,我遇到了和你一样的问题。

显然,asdf仅在交互模式下执行,这意味着如果我通过连接ssh到服务器,我可以运行它并mix照常使用,但如果从不同的机器我尝试执行命令(通过不物理登录并与终端交互) 然后它失败并出现与您相同的错误。

可能的解决方案

这个问题有两种可能的解决方案:

  1. 按照原始文档中的说明在本地安装 erlang 和 elixir 。
  2. 更改.bashrc文件

本地安装 Erlang 和 Elixir

@Gus 提出的第一个解决方案在技术上是可行的。但是,您将被困在机器中的特定 erlang/elixir 版本中,版本之间的交换将是不可能的,更新和修复也不会那么快可用。

对于我这个拥有多个不同版本的 Elixir 项目的人来说,这个解决方案是一个很大的“禁忌”。

更改 .bashrc 文件

第二种解决方案是手动编辑您的~/.bashrc文件。默认情况下,除非您以交互方式(手动)登录,否则系统不会加载mix、用户环境变量和其他内容。要更改此行为,您可以注释以下代码(或将其删除)

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Run Code Online (Sandbox Code Playgroud)

这个解决方案很脏,但如果你使用它,你就可以完全访问所有内容,就像手动访问一样。

问题

这些解决方案的问题在于他们不使用 Edeliver,他们只是使用 Distillery。

另一个问题是,第二个解决方案非常笨拙,所以我不确定这是一个好的做法(更不用说潜在的安全隐患)。

希望能帮助到你!