minhajuddin/mix_script

SyntaxError in mix.exs:22 for every elixir script

Closed this issue · 0 comments

Eiji7 commented

Environment:

OS: Funtoo Linux

=== Enabled Profiles: ===

        arch: x86-64bit
       build: current
     subarch: intel64-ivybridge
              # ...

Elixir and Erlang version manager: asdf
Elixir version: 1.5.2-otp-20
Erlang version: 20.1

Steps to reproduce:

  1. mix escript.install hex mix_script
  2. update PATH environment variable
  3. touch example.exs (or just copy example from README.md)
  4. mix_script compile example.exs

Full log (replaced tmp directory name with: ...):

17:48:36.572 [info]  parsing script @ example.exs

17:48:36.581 [info]  Found these deps: 

17:48:36.581 [info]  Found this in the script: 

17:48:36.583 [info]  creating tmp dir

17:48:36.608 [info]  created tmp dir /tmp/...

17:48:36.612 [info]  executing: "mix" with args ["new", "/tmp/...", "--module", "MixScript", "--app", "mix_script"]
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/mix_script.ex
* creating test
* creating test/test_helper.exs
* creating test/mix_script_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd /tmp/...
    mix test

Run "mix help" for more commands.


17:48:36.893 [info]  created mix project

17:48:36.893 [info]  replacing deps

17:48:36.896 [info]  setting up escript

17:48:36.896 [info]  executing: "mix" with args ["deps.get"]
** (SyntaxError) mix.exs:22: "do" is missing terminator "end". unexpected token: "]" at line 26
    (elixir) lib/code.ex:334: Code.load_file/2
    (mix) lib/mix/cli.ex:26: Mix.CLI.proceed/1
    (elixir) lib/code.ex:376: Code.require_file/2
ERROR:
{"", 1}

17:48:37.180 [info]  executing: "mix" with args ["escript.build"]
** (SyntaxError) mix.exs:22: "do" is missing terminator "end". unexpected token: "]" at line 26
    (elixir) lib/code.ex:334: Code.load_file/2
    (mix) lib/mix/cli.ex:26: Mix.CLI.proceed/1
    (elixir) lib/code.ex:376: Code.require_file/2
ERROR:
{"", 1}
** (File.CopyError) could not copy from "/tmp/.../mix_script" to "/home/username/test2": no such file or directory
    (elixir) lib/file.ex:631: File.cp!/3
    (mix_script) lib/mix_script.ex:10: MixScript.main/1
    (elixir) lib/kernel/cli.ex:90: anonymous fn/3 in Kernel.CLI.exec_fun/2

Expected result:

Project should be compiled and generate a binary.

Actual result:

Project does not compile and therefore can't generate a binary.

Found problem:

Here is output of cat /tmp/.../mix.exs command:

defmodule MixScript.Mixfile do
  use Mix.Project

  def project do
    [
      app: :mix_script,
      version: "0.1.0",
      elixir: "~> 1.5",
escript: [main_module: MixScript],
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
[]
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
    ]
  end
end

As you can see at end of &deps/0 function there is extra ] character that causes SyntaxError.

Possible solutions:

  1. cond in

    could return full List that is added to returned tuple, so you can filter every line before end in this function.

  2. Generate file from your own template with current Elixir version and updated dependencies list.

Workaround

I have created PR: #2, so anyone that needs it working can now follow few simple steps:

  1. Clone my repository:
    git clone git@github.com:Eiji7/mix_script.git
    or:
    git clone https://github.com/Eiji7/mix_script.git
  2. Enter directory: cd mix_script
  3. Build project: MIX_ENV=prod mix escript.build
  4. Optionally copy mix_script compiled binary wherever you like 😄
  5. Run path/to/compiled/mix_script path/to/example.exs