我有凤凰伞应用程序。当在所述应用程序中时,如果
MIX_ENV=prod
,我可以毫无问题地运行它。但是,如果我在 mix test
时执行 MIX_ENV=dev
,则会收到错误。
我的错误如下:
18:39:42.101 [error] ** wx object server {:local, WebInterface} terminating
** Last message in was {:"$gen_cast", {:show, &WebInterface.Endpoint.url/0}}
** When Server state == %Desktop.Window{
module: nil,
taskbar: nil,
frame: {:wx_ref, 35, :wxFrame, []},
notifications: %{},
webview: {:wx_ref, 49, :wxWebView, []},
home_url: &WebInterface.Endpoint.url/0,
last_url: nil,
title: "Market Manager",
rebuild: 0,
rebuild_timer: {:interval, #Reference<0.2679771817.2635857922.255366>}
}
** Reason for termination ==
** {:badarg,
[
{:erlang, :binary_to_existing_atom,
["Elixir.WebInterface.Endpoint.HTTP", :utf8],
[error_info: %{module: :erl_erts_errors}]},
{:elixir_aliases, :safe_concat, 1,
[file: ~c"src/elixir_aliases.erl", line: 139]},
{WebInterface.Endpoint, :url, 0,
[file: ~c"lib/web_interface/endpoint.ex", line: 4]},
{Desktop.Window, :prepare_url, 1,
[file: ~c"lib/desktop/window.ex", line: 666]},
{Desktop.Window, :handle_cast, 2,
[file: ~c"lib/desktop/window.ex", line: 604]},
{:wx_object, :handle_msg, 5, [file: ~c"wx_object.erl", line: 493]},
{:proc_lib, :init_p_do_apply, 3, [file: ~c"proc_lib.erl", line: 241]}
]}
读到这里,我明白问题来自我的
application.ex
,即:
@impl true
def start(_type, _args) do
children = [
Telemetry,
{Phoenix.PubSub, name: PubSub},
Endpoint,
Manager,
%{
id: Desktop.Window,
start:
{Desktop.Window, :start_link,
[
[
app: :web_interface,
id: WebInterface,
title: "Market Manager",
size: WindowUtils.calculate_window_size(0.6, 0.8),
menubar: MenuBar,
icon: "static/images/resized_logo_5_32x32.png",
url: &WebInterface.Endpoint.url/0 # This line seems to be a problem
]
]},
restart: :transient,
shutdown: 5_000
}
]
opts = [strategy: :one_for_one, name: WebInterface.Supervisor]
Supervisor.start_link(children, opts)
end
阅读更多有关该主题的内容后,我将
config/test.exs
更改为:
import Config
config :web_interface, WebInterface.Endpoint,
http: [ip: {127, 0, 0, 1}, port: 4002],
secret_key_base: "some_key",
server: true,
check_origin: false
但这仍然不能解决问题。
相比之下,这是我的
config/prod.exs
:
config :web_interface, WebInterface.Endpoint,
http: [ip: {127, 0, 0, 1}, port: 80],
cache_static_manifest: "priv/static/cache_manifest.json",
secret_key_base: "some_key",
check_origin: false,
server: true
但是问题仍然出现。
该错误消息表明 wxWidgets 有问题。我猜测 Desktop.Window 正在使用 wxWidgets。确保 wxWidgets 正常工作的一种方法是尝试启动 Erlang 观察器。在 iex 中执行此操作:
:observer.start()
如果观察者正确启动,那么 wxWidgets 就没有问题,问题出在其他地方。如果它没有启动,那么您需要找出 wxWidgets 出了什么问题。
我不确定为什么桌面的行为与测试和生产不同。