我可以用lein run运行我的命令吗?

时间:2017-11-28 14:03:04

标签: clojure leiningen

我目前通过调用lein run my-cli-command arg --option

编写了一个简单的cli

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

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

3 个答案:

答案 0 :(得分:3)

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

您可以通过创建Java归档文件将lein排除在等式之外:

lein uberjar

然后像其他任何人一样运行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非常弱,但可能有一种方法可以将参数传递给蝙蝠,并将它们传递给jar,这样你就不需要对参数进行硬编码。

答案 1 :(得分:2)

从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

答案 2 :(得分:1)

你可以使用"二进制有效载荷"在shell脚本中,如https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable

中所述

基本上,您可以在单个shell脚本文件中连接shell脚本和uberjar,并在脚本中执行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