2017-11-19 8 views
1

私のPhoenixアプリケーションでは、assets/ディレクトリにあるReactフロントエンドを実行しています...それは自分自身のpackage.jsonファイルであり、実行したいと思いますPhoenixアプリケーションのmix.exsファイルのエイリアス化されたNPMスクリプトです。私はElixirのSystem.cmd()を試してきましたが、そのトリックをやっているようには見えません。 assets/package.jsonで、私が期待した作品としてPhoenixフレームワーク - サブディレクトリにNPMスクリプトを実行します

"lint": "eslint ./*.js ./js/*.js || exit 0" 

assets/ディレクトリから$ npm run lintを実行しているを持っている...しかし、それは粉砕されるだろう -

基本的に、私は私のフロントエンド用のlintコマンドを設定しましたアプリのトップレベルからコマンドを実行できるようにする必要があります。私mix.exsファイルで

、私はそうのような別名で実験した

defp aliases do 
    [ 
    "lint": [System.cmd("npm", ["run lint"], cd: "assets") 
    ] 
end 

が、mix lintを実行すると、かなり冗長なエラーが発生します。

** (FunctionClauseError) no function clause matching in Mix.Task.run_alias/3  

The following arguments were given to Mix.Task.run_alias/3: 

    # 1 
    [{"\nUsage: npm <command>\n\nwhere <command> is one of:\n access, adduser, bin, bugs, c, cache, completion, config,\n ddp, dedupe, deprecate, dist-tag, docs, edit, explore, get,\n help, help-search, i, init, install, install-test, it, link,\n list, ln, login, logout, ls, outdated, owner, pack, ping,\n prefix, prune, publish, rb, rebuild, repo, restart, root,\n run, run-script, s, se, search, set, shrinkwrap, star,\n stars, start, stop, t, tag, team, test, tst, un, uninstall,\n unpublish, unstar, up, update, v, version, view, whoami\n\nnpm <cmd> -h  quick help on <cmd>\nnpm -l   display full usage info\nnpm help <term> search for help on <term>\nnpm help npm  involved overview\n\nSpecify configs in the ini-formatted file:\n /Users/user/.npmrc\nor on the command line via: npm <command> --key value\nConfig info can be viewed via: npm help config\n\[email protected] /Users/user/.nvm/versions/node/v6.11.1/lib/node_modules/npm\n", 1}] 

    # 2 
    [] 

    # 3 
    :ok 

Attempted function clauses (showing 3 out of 3): 

    defp run_alias([h | t], alias_args, _res) when is_binary(h) 
    defp run_alias([h | t], alias_args, _res) when is_function(h, 1) 
    defp run_alias([], _alias_task, res) 

(mix) lib/mix/task.ex:331: Mix.Task.run_alias/3 
(mix) lib/mix/task.ex:266: Mix.Task.run/2 
(mix) lib/mix/cli.ex:75: Mix.CLI.run_task/2 
(elixir) lib/code.ex:376: Code.require_file/2 

[OK]をので、明らかに私が何か間違ったことをやっています。 PhoenixアプリケーションのサブディレクトリでNPMコマンドを実行することはできますか?

答えて

1

まず、runlintは、引数リストで別の文字列にする必要があります。

第2に、エイリアスが呼び出されたときではなく、すぐにコマンドが実行されます。

次のような別名で任意のコードを実行するために"run -e ..."エイリアスを使用することができます。

"lint": [~s|run -e 'System.cmd("npm", ["run", "lint"], cd: "assets")'|) 

(私はそれが簡単にシングルとダブルの両方の引用符付き文字列を入力できるようにすること~s||構文を使用しています。 )

+0

恐ろしい!これは正しく動作するようですが、2つの簡単なこと... 1.コードに小さな誤字があります。閉じた括弧は大括弧でなければなりません。私はそれを修正すると、アプリケーションはコンパイルされ、タスクはエラーなしで実行されました。ただし、タスクの出力は端末では表示されませんでした。出力を既存のシェルにパイプする方法はありますか?私は 'System'文書のオプションを見たが、何も見なかった。 (私は 'System ... 'の前に' IO.inspect'を追加しようとしましたが、それは整然としたESLintの書式設定ではありませんでしたが...)。 – skwidbreth

+1

ああ、それを得た! IO.stream(:stdio、:line)] 'オプションに 'into:IO.stream(:stdio、:line)'を追加するだけでした。おかげでDogbert !!! – skwidbreth

関連する問題