【问题标题】:Can I run my command with out lein run?我可以在没有 lein run 的情况下运行我的命令吗?
【发布时间】:2017-11-28 14:03:03
【问题描述】:

我目前运行一个我通过调用编写的简单 cli:lein run my-cli-command arg --option

如何在不需要包含 lein run 的情况下调用我的命令?这就是我所追求的:my-cli-command arg --option

我是否需要将其转换为二进制文件或可执行文件,如果需要如何转换?

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    据我所知,没有办法只运行my-cli-command arg --option

    您可以通过创建 Java 存档来消除 lein:

    lein uberjar
    

    然后像运行其他 jar 一样运行该 jar:

    java -jar target/my-cli-command-standalone.jar arg --option
    

    uberjar 将根据您在project.clj 中对项目的名称命名该 jar,并将创建一个依赖外部依赖项的 jar,以及一个不依赖外部依赖项的 jar (standalone)。

    然后,正如@gary 指出的那样,您可以将java - jar ... 命令粘贴在 .bat 文件中,随意命名,然后直接运行 bat。我的bat-Fu 很弱,但可能有一种方法可以将参数传递给 bat 并将它们传递给 jar,这样您就不需要对参数进行硬编码。

    【讨论】:

    • 此解决方案将允许您创建一个名为“my-cli-command”的 bat 文件或 shell 脚本,您可以像最初想要的那样调用它。脚本看起来像 java -jar target/my-cli-command-standalone.jar <arg 1> <arg 2>
    • @Gary 是的。我会尝试添加一个简介。
    【解决方案2】:

    我没用过,但我知道inlein 存在,它看起来像你需要的。

    Inlein 是运行 Clojure 脚本的最简单、最快的方法。您只需要内联您的依赖项,添加一个 shebang 行,并使脚本文件可执行。

    还有一个最小的例子:

    #!/usr/bin/env inlein
    
    '{:dependencies [[org.clojure/clojure "1.8.0"]]}
    
    (println "hello world!")
    

    【讨论】:

    • 这太棒了!
    【解决方案3】:

    从 Clojure 1.9 开始,有新的 CLI 工具!安装见this guide。你可以像这样创建一个可执行脚本:

    #!/usr/local/bin/clojure
    (println "Hello World! from" *ns*)
    (require '[clojure.walk :as walk])
    (walk/postwalk-demo {:woo ::yeah})
    

    然后使脚本可执行并执行:

    $ chmod +x my_script
    $ ./my_script
    Hello World! from #object[clojure.lang.Namespace 0x1ebea008 user]
    Walked: :woo
    Walked: :user/yeah
    Walked: [:woo :user/yeah]
    Walked: {:woo :user/yeah}
    

    启动时间似乎也有所改善。在最近的 MBP 上运行一个简单的脚本(只打印一个字符串)需要一秒钟多一点的时间:

    time ./hello
    Hello World!
    ./hello  1.51s user 0.12s system 184% cpu 0.887 total
    

    【讨论】:

    • 这是迄今为止最好的解决方案恕我直言,现在 1.9 已经发布。不过,对 emacs 用户的公平警告:当您打开此类文件时,默认情况下您不会在 clojure-mode 中!
    【解决方案4】:

    您可以按照https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable 中的说明在 shell 脚本中使用“二进制有效负载”

    基本上,您可以将一个 shell 脚本和您的 uberjar 连接到一个 shell 脚本文件中,并在脚本中执行 java,将该脚本指定为类路径上的 jar 文件 - 该示例来自链接的帖子:

    将你的运行脚本保存在stub.sh:

    #!/bin/sh
    MYSELF=`which "$0" 2>/dev/null`
    [ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
    java=java
    if test -n "$JAVA_HOME"; then
        java="$JAVA_HOME/bin/java"
    fi
    exec "$java" $java_args -jar $MYSELF "$@"
    exit 1 
    

    然后将它与您的 uberjar 连接起来:

    cat stub.sh my-cli-command-uberjar.jar > my-cli-command && chmod +x my-cli-command

    现在可以直接运行了:

    ./my-cli-command args...

    还有一个 lein 插件可以自动化这个过程:lein-binplus

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      相关资源
      最近更新 更多