如何将 shell 脚本作为混合别名运行?
我试过以下没有运气:
defp aliases() do
[
"test": [ "./scripts/test.sh" ]
]
end
defp aliases() do
[
"test": [ "scripts/test.sh" ]
]
end
Run Code Online (Sandbox Code Playgroud)
每个返回的变化为:
** (Mix) The task "./scripts/test" could not be found
无法使用mix archive.install命令安装比最新稳定版(例如 1.4.0)更早的 Phoenix 版本(例如 1.3.4)。
根据此线程未实现的解决方案:https : //github.com/phoenixframework/phoenix/issues/2991
$ mix archive.install hex phx_new 1.3.4
** (Mix) No matching version for phx_new 1.3.4 (from: mix.exs) in registry
The latest version is: 1.4.0
Run Code Online (Sandbox Code Playgroud) 所以我有一个遵循以下布局的应用程序模块:
defmodule Project.Application do
use Application
def start(_type, _args) do
children = [
randomchild1,
randomchild2,
{Project.runapp, "argument" }
]
opts = [strategy: :one_for_all, name: Project.Supervisor]
Supervisor.start_link(children, opts)
end
end
Run Code Online (Sandbox Code Playgroud)
现在,当我运行它时,我使用它mix run --no-halt并且运行完美。
我想用在命令行中传递的值替换“参数”?我不知道如何向mix run --no-halt.
我想做的就是将一个值传递给 start 方法并使用它来定义子进程。
我编写了以下 mix.ex 以将我的 Phoenix 应用程序作为 tar 球发布,请参阅 Mix.Tasks.Release 文档的 \xe2\x80\x9cSteps\xe2\x80\x9d部分。
\ndefmodule MyApp.MixProject do\n use Mix.Project\n\n def project do\n [\n apps_path: "apps",\n apps: [:shared, :admin, :shop],\n version: "0.1.0",\n start_permanent: Mix.env() in [:qa, :prod],\n deps: deps(),\n releases: [\n my_app: [\n applications: [\n admin: :permanent,\n shop: :permanent\n ],\n steps: [:assemble, ©_extra_files/1, :tar]\n ]\n ],\n default_release: :my_app\n ]\n end\n\n defp copy_extra_files(release) do\n File.cp_r("apps/shared/priv/repo/seeds", release.path <> "/seeds")\n release\n end\n\n defp deps do\n []\n end\nend\nRun Code Online (Sandbox Code Playgroud)\n当我运行 时MIX_ENV=qa mix release my_app,它 …
以下代码不足以列出自定义任务吗mix help?
defmodule Mix.Tasks.Start do
use Mix.Task
@shortdoc "Starts [App]"
def run(_) do
IO.puts("Starting [App]...")
end
end
Run Code Online (Sandbox Code Playgroud)
我认为装饰器@shortdoc足以列出我的自定义任务,mix help但我重新编译了我的代码,但我的自定义任务没有列出在 上mix help。
当我使用以下命令
mix deps.update --all
mix如果mix.ex文件中尚未更改软件包的版本,则将使用本地缓存的软件包.所以问题是,我如何强制mix不使用缓存版本并从服务器下载呢?例如,如果某个软件包的最后一个版本发生了变化,我想选择那些软件包,即使版本没有被碰到.
我正在构建一个使用hackneyErlang项目的Elixir应用程序,我无法使用hackney提供的方法.我mix.exs看起来像这样:
defmodule Connecter.Mixfile do
use Mix.Project
def project do
[app: :connecter,
version: "0.0.1",
elixir: "~> 1.2-dev",
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]]
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"}
#
# Type "mix help …Run Code Online (Sandbox Code Playgroud) 我目前正在努力处理混合中的配置值(特别是在运行测试时).这是我的情景:
test.exs档案/config我现在正在这样做(这不起作用).正在测试的模块(简化):
defmodule Streamex.Client do
@api_region Application.get_env(:streamex, :region)
@api_key Application.get_env(:streamex, :key)
@api_secret Application.get_env(:streamex, :secret)
@api_version "v1.0"
@api_url "api.getstream.io/api"
def full_url(%Request{} = r) do
url = <<"?api_key=", @api_key :: binary>>
end
end
Run Code Online (Sandbox Code Playgroud)
测试:
setup_all do
Streamex.start
Application.put_env :streamex, :key, "KEY"
Application.put_env :streamex, :secret, "SECRET"
Application.put_env :streamex, :secret, ""
end
Run Code Online (Sandbox Code Playgroud)
运行时会发生的情况mix test是主模块(从这些值设置属性)会抛出以下错误,因为它找不到有效值:
lib/streamex/client.ex:36: invalid literal nil in <<>>
Run Code Online (Sandbox Code Playgroud)
我还在开始,所以这看起来很明显,但在阅读完文档后我找不到解决方案.
我为我的Elixir项目写了一些测试并将它们放在test/目录中.现在我跑了mix test,我得到:
$ mix test
Test patterns did not match any file:
Run Code Online (Sandbox Code Playgroud)
就是这样,之后什么都没有.我是否必须手动设置测试路径?快速谷歌搜索没有透露任何信息.
这就是我所有测试的样子:
# project_dir/test/my_app/some_module.exs
defmodule MyApp.SomeModule.Test do
use ExUnit.Case
doctest MyApp.SomeModule
test "method 1" do
assert MyApp.SomeModule.method_1_works?
end
test "method 2" do
assert MyApp.SomeModule.method_2_works?
end
end
Run Code Online (Sandbox Code Playgroud) 在lib/mix/tasks/load_mnemonics.ex下创建自定义任务从CSV文件批量插入数据库表时出现奇怪的错误.执行任务的命令是
混合data_monitor.load_mnemonics
defmodule Mix.Tasks.DataMonitor.LoadMnemonics do
use Mix.Task
alias DataMonitor.Mnemonic
alias DataMonitor.Repo
require Logger
@shortdoc "Loads mnemonics from mnemonics.csv"
def run(_) do
mnemonics =
File.stream!(Path.expand("files/mnemonics.csv"))
|> CSV.decode!(headers: true)
insert_rows =
Enum.reduce(mnemonics, [], fn row, result ->
result ++
[
row
|> Map.new(fn {k, v} -> {String.to_atom(k), v} end)
|> Map.put(:inserted_at, Timex.now())
|> Map.put(:updated_at, Timex.now())
]
end)
Repo.insert_all(Mnemonic, insert_rows)
end
end
Run Code Online (Sandbox Code Playgroud)
错误日志:
** (ArgumentError) argument error
(stdlib) :ets.lookup_element(Ecto.Registry, nil, 3)
lib/ecto/registry.ex:18: Ecto.Registry.lookup/1
lib/ecto/adapters/sql.ex:251: Ecto.Adapters.SQL.sql_call/6
lib/ecto/adapters/sql.ex:198: Ecto.Adapters.SQL.query!/5
lib/ecto/adapters/postgres.ex:96: Ecto.Adapters.Postgres.insert_all/7
lib/ecto/repo/schema.ex:52: Ecto.Repo.Schema.do_insert_all/7
(mix) lib/mix/task.ex:314: …Run Code Online (Sandbox Code Playgroud)