首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建几个相关的小型工具的Clojure项目

构建几个相关的小型工具的Clojure项目
EN

Stack Overflow用户
提问于 2016-11-02 15:21:56
回答 1查看 89关注 0票数 1

我正在使用一个具有公共功能库的Clojure项目,但我希望通过一些小型命令行工具来使用这个库。

我们叫他们tool1,tool2,tool3。

这些工具中的每一个都封装了库的大部分内容。

我应该如何组织我的Clojure源代码,在我的project.clj文件中需要什么?

现在我的代码在

代码语言:javascript
复制
src/projectname/core.cljc ; a default executable

cljc/projectname/lib1.cljc 
cljc/projectname/lib2.cljc ; cljc because I want to use from clojurescript too later

等。

我应该把工具1.clj,tool2.clj等放在哪里?

我的防御计划是

代码语言:javascript
复制
(defproject 
   ....
     :aot [projectname.core]
     :main project.core )

我需要投入什么来告诉它,我想让这三个独立的,可执行的工具?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-02 16:10:58

你可以做这个使用lein-exec库

首先,像这样设置~/bin (或类似的):

代码语言:javascript
复制
> ls -ldF  ~/bin/l*
lrwxrwxrwx 1 alan alan 26 Oct 31 08:29 /home/alan/bin/lein -> /home/alan/cool/tools/lein*
lrwxrwxrwx 1 alan alan 31 Oct 31 08:29 /home/alan/bin/lein-exec -> /home/alan/cool/tools/lein-exec*
lrwxrwxrwx 1 alan alan 33 Oct 31 08:29 /home/alan/bin/lein-exec-p -> /home/alan/cool/tools/lein-exec-p*

我有指向实际文件的符号链接,但是您可以直接复制它们。当然,确保~/bin在你的道路上。

然后编写一个可执行的clojure“脚本”,如下所示。当然,它必须是可执行的:

代码语言:javascript
复制
> ls -l say-hello 
-rwxrwxr-x 1 alan alan 212 Nov  2 09:10 say-hello

> cat say-hello

#!/usr/bin/env lein-exec

(defn say-hello [name] 
  (println (format "Hello from the command line, %s!" name)))

(do 
  ; *command-line-args* = <cmd> <arg1> <arg2> ...
  (say-hello (second *command-line-args*)))

我们走吧!

代码语言:javascript
复制
> ./say-hello buckaroo    
Hello from the command line, buckaroo!

至于项目组织,我会从简单的开始(和任何项目一样!)。可能只从一个源文件开始,每个“脚本”都有不同的函数作为切入点。随着项目的发展,您可以更容易地看到您想要在什么地方释放不同的名称空间/文件。

更新

您还可以使用lein uberjar完成此操作,然后直接调用java:

代码语言:javascript
复制
(ns clj.core
  (:gen-class))

(defn say-hello [name] 
  (println (format "Hello from the command line, %s!" name)))

(defn -main [& args]
  (say-hello (first args)))

> lein uberjar
Compiling 1 source files to /home/alan/clj/target/uberjar/classes
Compiling clj.core
Created /home/alan/clj/target/uberjar/clj-0.1.0-SNAPSHOT.jar
Created /home/alan/clj/target/uberjar/clj-0.1.0-SNAPSHOT-standalone.jar

> java -jar /home/alan/clj/target/uberjar/clj-0.1.0-SNAPSHOT-standalone.jar pardner
Hello from the command line, pardner!

因此,只需将java命令放入shell脚本中即可。还请注意,:gen-class是必需的,而且args不再包括脚本名。当然,您必须同时部署脚本文件和uberjar。

更新#2

您还可以使用此版本:

来源:

代码语言:javascript
复制
(ns clj.core
  (:gen-class))

(defn say-howdy [args]
  (println (format "Howdy, %s!" (first args))))

(defn give-reply [args]
  (println (format "Back at ya, %s!" (first args))))

(defn -main [& args]
  (let [method-name  (first  args)
        message      (second args) ]
    (cond 
      (= method-name "say-howdy" ) (say-howdy  (rest args))
      (= method-name "give-reply") (give-reply (rest args))
      :else (throw (NoSuchMethodException. (str "clj.core: invalid method='" method-name \')))))
)

剧本:

代码语言:javascript
复制
> ls -l say*
-rwxrwxr-x 1 alan alan 212 Nov  2 16:24 say-hello
-rwxrwxr-x 1 alan alan 104 Nov  2 16:35 say-howdy
-rwxrwxr-x 1 alan alan 105 Nov  2 16:35 say-reply

> cat ./say-howdy
#!/bin/bash
java -jar /home/alan/clj/target/uberjar/clj-0.1.0-SNAPSHOT-standalone.jar say-howdy pardner

> cat ./say-reply 
#!/bin/bash
java -jar /home/alan/clj/target/uberjar/clj-0.1.0-SNAPSHOT-standalone.jar give-reply $1

运行工具:

代码语言:javascript
复制
~/clj > ./say-howdy 
Howdy, pardner!

~/clj > ./say-reply
Back at ya, null!

~/clj > ./say-reply buckaroo
Back at ya, buckaroo!

让脚本更智能,并决定如何部署N个脚本和单个JAR文件是留给读者的练习。

;)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40383657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档