我在Elixir项目中整合协议实现时遇到问题.更具体地说,我使用了Ecto一些简单的项目Gold(无关紧要).问题是,它们(Ecto和Gold)都Poison用于序列化Decimals(并实现适当的协议).
Ecto外观的实现有点像这样:
defimpl Poison.Encoder, for: Decimal do
def encode(decimal, _opts), do: <<?", Decimal.to_string(decimal)::binary, ?">>
end
Run Code Online (Sandbox Code Playgroud)
在开发期间,有一个警告说该模块是重复的:
warning: redefining module Poison.Encoder.Decimal (current version loaded from /(...)/_build/dev/lib/gold/ebin/Elixir.Poison.Encoder.Decimal.beam)
lib/ecto/poison.ex:2
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用例如exrm构建版本时,我会收到错误,说我有duplicate_modules
===> Provider (release) failed with: {error,
{rlx_prv_assembler,
{release_script_generation_error,
systools_make,
{duplicate_modules,
[{{'Elixir.Poison.Encoder.Decimal',
gold,
"/(...)/rel/bitcoin_api/lib/gold-0.12.0/ebin"},
{'Elixir.Poison.Encoder.Decimal',
ecto,
"/(...)/rel/bitcoin_api/lib/ecto-2.0.2/ebin"}}]}}}}
Run Code Online (Sandbox Code Playgroud)
我应该怎么处理这个?这里的情况是我实际使用我自己的版本Gold,所以我可以篡改它来尽快解决它.我知道我可以再补充Ecto到Gold作为依赖,但似乎有点矫枉过正,只是实现一个协议是这样的.是否有某种宏来检查模块是否已经实现?
我使用html文件作为模板,使用以下代码,在dev模式下工作(不在exrm版本中):
{:ok, template} = File.read "priv/static/templates/receipt_template.html"
Run Code Online (Sandbox Code Playgroud)
当发行版与exrm打包时,此相对路径不再有效,并且找不到该文件.是否有更好的方法来声明路径,以便在将其转换为版本时不会搞砸?
我不知道在哪里放错误,elixir,phoenixframework或nodejs.
我正在尝试使用elxir和phoenix创建我的第一个版本.在发布版本期间,我看到以下错误.我只是不确定这是一个版本/依赖问题还是与nodejs有关的东西,因为我能找到的与eacces相关的唯一信息与nodejs有关系.我的配置中是否有任何遗漏?
这是错误堆栈:
Building release with MIX_ENV=prod.
** (CaseClauseError) no case clause matching: :eacces
lib/exrm/utils/utils.ex:110: ReleaseManager.Utils.relx/5
lib/mix/tasks/release.ex:341: anonymous fn/4 in Mix.Tasks.Release.do_release/1
lib/ex_unit/capture_io.ex:146: ExUnit.CaptureIO.do_capture_io/2
lib/ex_unit/capture_io.ex:119: ExUnit.CaptureIO.do_capture_io/3
lib/mix/tasks/release.ex:340: Mix.Tasks.Release.do_release/1
lib/mix/tasks/release.ex:78: Mix.Tasks.Release.do_run/1
(mix) lib/mix/task.ex:296: Mix.Task.run_task/3
(mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2
Run Code Online (Sandbox Code Playgroud)
我的环境如下:
$ elixir -v
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Elixir 1.3.4
$ npm --version
3.10.8
Run Code Online (Sandbox Code Playgroud)
我添加exrm之后运行了一些版本问题,我通过添加到我的依赖项解决了以下问题:
{:exrm, git: "git://github.com/bitwalker/exrm.git"},
{:relx, github: "erlware/relx", override: true},
{:erlware_commons, github: "erlware/erlware_commons", override: true},
{:cf, "~> 0.2.1", override: true}
Run Code Online (Sandbox Code Playgroud)
三个小时后......
我用mix创建了一个新的凤凰项目,可以重现这个问题.一旦我添加了exrm,我得到了同样的错误.我转换到酿酒厂看到同样的错误.我在酿酒厂创造了一个问题,希望能找到解决方案.关于酿酒厂的第142期
编辑:
酿酒厂报告中有关此问题的其他详细信息:
$ …
我想在一台机器上使用Exrm和Erlang.
我需要创建多个版本,这些版本仅与节点名称不同.
我知道,我可以配置节点名称rel/vm.args,但它将是静态的.我能以某种方式生成具有不同节点名称的多个版本吗?
我正在尝试为我的凤凰框架项目创建一个版本.
一切正常,直到我的代码需要使用来自OTP的httpc模块执行特定操作.
显然exrm,没有捆绑httpc模块,因此无法找到它.
我试图将它添加到我的mix.exs应用程序依赖项中,但是一旦我这样做,就会因为"错误"而拒绝创建发布版本
有谁知道如何解决这一问题 ?
对于mix.env:httpc作为依赖:
$ MIX_ENV=prod mix release --verbosity=vebose
Building release with MIX_ENV=prod.
==> Generating relx configuration...
==> Generating sys.config...
==> Generating boot script...
==> Packaging consolidated protocols...
==> Generating release...
===> Starting relx build process ...
===> Resolving OTP Applications from directories:
/home/morgan/Documents/rateapi/_build/prod/lib
/home/morgan/Documents/rateapi/deps
/usr/local/lib/elixir/bin/../lib/eex/ebin
/usr/local/lib/elixir/bin/../lib/elixir/ebin
/usr/local/lib/elixir/bin/../lib/ex_unit/ebin
/usr/local/lib/elixir/bin/../lib/iex/ebin
/usr/local/lib/elixir/bin/../lib/logger/ebin
/usr/local/lib/elixir/bin/../lib/mix/ebin
/home/morgan/Documents/rateapi/lib
/usr/erlang/otp_R18B03/lib/erlang/lib
/home/morgan/Documents/rateapi/rel
==> ERROR: "Failed to build release. Please fix any errors and try again."
Run Code Online (Sandbox Code Playgroud)
对于mix.env没有:httpc依赖:
** (exit) an exception was raised:
** (UndefinedFunctionError) function …Run Code Online (Sandbox Code Playgroud) 我试图用EXRM发布我的应用程序.除了无法启动的WebSockets之外,整个应用程序正在运行
这是浏览器中的错误(Chrome)
与'ws:// localhost:4001/socket/websocket?token = undefined'的WebSocket连接失败:WebSocket握手期间出错:意外响应代码:403
似乎变量token可能是个问题.一开始Mix phoenix.server就一切顺利.但随着命令发布:
$ mix deps.get
$ mix compile
$ MIX_ENV=prod mix digest
$ MIX_ENV=prod mix release
$ ./rel/project/bin/project
Run Code Online (Sandbox Code Playgroud)
可能是关于我的一些错过的步骤或凤凰相关的问题.
我正在尝试创建一个库存Phoenix应用程序的发布(基于Elixir和Erlang)使用exrm.
dev混合环境的第一个版本创建正常,但在运行时崩溃./rel/my_app/bin/my_app console.这发生在Vagrant/Virtual Box虚拟机中运行Ubuntu 14.04.
在我的Mac上,相同的设置运行正常.不幸的是,我需要在与目标服务器具有相同架构的机器上构建版本,该服务器将运行Ubuntu.
您可以在这里找到该应用程序:https://github.com/mavenastic/my_app.它包括在VM上安装依赖项和创建项目所需的步骤(请参阅参考资料STEPS.md)以及Erlang崩溃转储.
以下是我尝试运行控制台时出现的错误:
{"Kernel pid terminated",application_controller,"{application_start_failure,my_app,{{shutdown,{failed_to_start_child,'Elixir.MyApp.Endpoint',{shutdown,{failed_to_start_child,'Elixir.Phoenix.CodeReloader.Server',{undef,[{'Elixir.Mix.Project',config,[],[]},{'Elixir.Phoenix.CodeReloader.Server',init,1,[{file,\"lib/phoenix/code_reloader/server.ex\"},{line,29}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,328}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,240}]}]}}}}},{'Elixir.MyApp',start,[normal,[]]}}}"}
Run Code Online (Sandbox Code Playgroud)
编辑:
我也尝试为生产环境创建一个版本MIX_ENV=prod mix release.发布成功生成并MIX_ENV=prod PORT=8889 ./rel/my_app/bin/my_app console运行正常.但是,我无法ping服务器,也无法在启动时运行远程控制台,因此应用程序运行正常似乎仍然缺少.
$ MIX_ENV=prod PORT=8889 ./rel/my_app/bin/my_app start
$ MIX_ENV=prod PORT=8889 ./rel/my_app/bin/my_app ping
=INFO REPORT==== 24-Oct-2015::10:28:25 ===
Protocol: "inet_tcp": register/listen error: econnrefused
escript: exception error: no match of right hand side value
{error,
{{shutdown,
{failed_to_start_child,net_kernel,
{'EXIT',nodistribution}}},
{child,undefined,net_sup_dynamic,
{erl_distribution,start_link,
[['my_app_maint_2551@127.0.0.1',longnames]]},
permanent,1000,supervisor,
[erl_distribution]}}}
$ ps aux | …Run Code Online (Sandbox Code Playgroud) 什么时候仅deps在my中指定依赖项mix.exs而不在in中指定运行时依赖项才合适applications?
我认为这applications是需要启动的实际应用程序,然后才能启动我自己的应用程序,但是我遇到了一个问题,exrm就是Jazz直到我将包含在内:jazz时,才将库(我认为仅包含纯函数)放到发行版中applications。
我是Elixir的新手,这是我尝试使用exrm发布的第一个应用程序.我的应用程序与Redis数据库交互以从队列中使用作业(使用exq),并使用eredis在Redis中存储已处理作业的结果.
当我运行它时,我的应用程序运行正常iex -S mix,并且在编译成escript时运行也很好.但是当我使用exrm时,应用程序编译时没有任何问题,但是当我运行它时它会崩溃.
这是崩溃输出:
$ ./rel/my_app/bin/my_app console
{"Kernel pid terminated",application_controller,"{application_start_failure,my_app,{bad_return,{{'Elixir.MyApp',start,[normal,[]]},{'EXIT',{{badmatch,{error,{{'EXIT',{{badmatch,{error,{undef,[{eredis,start_link,[],[]},{'Elixir.MyApp.Cache',init,1,[{file,\"lib/my_app/cache.ex\"},{line,8}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,306}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,237}]}]}}},[{'Elixir.MyApp.Cache',start_link,1,[{file,\"lib/my_app/cache.ex\"},{line,21}]},{supervisor,do_start_child,2,[{file,\"supervisor.erl\"},{line,314}]},{supervisor,handle_start_child,2,[{file,\"supervisor.erl\"},{line,685}]},{supervisor,handle_call,3,[{file,\"supervisor.erl\"},{line,394}]},{gen_server,try_handle_call,4,[{file,\"gen_server.erl\"},{line,607}]},{gen_server,handle_msg,5,[{file,\"gen_server.erl\"},{line,639}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,237}]}]}},{child,undefined,'Elixir.MyApp.Cache',{'Elixir.MyApp.Cache',start_link,[[{host,\"127.0.0.1\"},{port,6379},{database,0},{password,[]},{reconnect_timeout,100},{namespace,<<>>},{queues,[<<\"elixir\">>]}]]},permanent,5000,worker,['Elixir.MyApp.Cache']}}}},[{'Elixir.MyApp.Supervisor',start_cache,1,[{file,\"lib/my_app/supervisor.ex\"},{line,17}]},{'Elixir.MyApp.Supervisor',start_link,0,[{file,\"lib/my_app/supervisor.ex\"},{line,9}]},{'Elixir.MyApp',start,2,[{file,\"lib/my_app.ex\"},{line,10}]},{application_master,start_it_old,4,[{file,\"application_master.erl\"},{line,272}]}]}}}}}"}
Run Code Online (Sandbox Code Playgroud)
这是我的应用程序的mix.exs:
defmodule MyApp.Mixfile do
use Mix.Project
def project do
[
app: :my_app,
version: "0.0.1",
name: "MyApp",
elixir: "~> 1.0",
escript: escript_config,
deps: deps
]
end
def application do
[
applications: app_list(Mix.env),
mod: { MyApp, [] },
env: [ queue: 'elixir']
]
end
def included_applications do
[ :logger, :httpoison, :eredis, :exq, :dotenv, :exjsx, :ex_doc, :oauth2, :sweet_xml ]
end …Run Code Online (Sandbox Code Playgroud) 昨天我遇到了一个非常奇怪的问题.
组态:
- Erlang 19
- Elixir 1.3.1
- Exrm 1.0.6
- Phoenix 1.2.0
- Ubuntu 15.10
Run Code Online (Sandbox Code Playgroud)
步骤:
MIX_ENV=prod mix compileMIX_ENV=prod mix releaserel/susu_online/bin/susu_online console然后我得到一个错误,无法弄清楚为什么会发生这种情况
以下错误:
Erlang/OTP 19 [erts-8.0] [source-6dc93c1] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
10:37:29.758 [error] Supervisor 'Elixir.Logger.Supervisor' had child 'Elixir.Logger.ErrorHandler' started with 'Elixir.Logger.Watcher':watcher(error_logger, 'Elixir.Logger.ErrorHandler', {true,false,500}, link) at <0.1445.0> exit with reason normal in context child_terminated
10:37:29.767 [info] Application lager started on node 'susu_online@127.0.0.1'
10:37:29.767 [info] Application hpack started on node 'susu_online@127.0.0.1'
10:37:29.768 [info] Application …Run Code Online (Sandbox Code Playgroud)