How to run .clj file as a script using leningen?

后端 未结 4 1108
囚心锁ツ
囚心锁ツ 2020-12-23 17:37

This is the second question after Is there a standalone Clojure package within Leiningen?

For example, I have a file hello_world.clj, and I can run it u

相关标签:
4条回答
  • 2020-12-23 18:12

    leiningen can create an 'uberjar' for you with all your dependencies....

    lein uberjar
    

    will create a jar for you in the target subdirectory. The jar will contain all the dependencies listed in your project.clj, so you don't need to worry about constructing a complex classpath to invoke your code.

    You can reference this uberjar as a single entry in your java classpath in the normal way or, specify a main-class in the project.clj invoke it as an executable jar.

    e.g. a project.clj like this:

    (defproject clj-scratch "1.0.0-SNAPSHOT"
     :description "FIXME: write description"
     :dependencies [[org.clojure/clojure "1.4.0"]                     
     :main clj-scratch.core)
    

    will invoke the -main function in clj-scratch.core namespace

    if you run:

    java -jar target/clj-scratch-1.0.0-SNAPSHOT-standalone.jar
    
    0 讨论(0)
  • 2020-12-23 18:18

    There are several ways with lein repl:

    • Very slow: cat your_file.clj | lein repl
    • Slow: echo '(load-file "your_file.clj")' | lein repl
    • Fast:
      1. lein repl
      2. (load-file "your_file.clj")
      3. repeat 2
    0 讨论(0)
  • 2020-12-23 18:25

    I like to use inlein for that.

    #!/usr/bin/env inlein
    
    '{:dependencies [[org.clojure/clojure "1.8.0"]
                     [com.hypirion/primes "0.2.1"]]}
    
    (require '[com.hypirion.primes :as p])
    
    (when-not (first *command-line-args*)
      (println "Usage:" (System/getProperty "$0") "prime-number")
      (System/exit 1))
    
    (-> (first *command-line-args*)
        (Long/parseLong)
        (p/get)
        println)
    

    Then just chmod +x script.clj and run it!

    Alternatively you can just inlein script.clj my args here as well.

    0 讨论(0)
  • 2020-12-23 18:33

    use lein-exec plugin, example from readme.md (updated with "lein" instead of "lein2")

    cat foo.clj | lein exec
    lein exec -e '(println "foo" (+ 20 30))'
    lein exec -ep "(use 'foo.bar) (pprint (map baz (range 200)))"
    lein exec -p script/run-server.clj -p 8088
    lein exec ~/common/delete-logs.clj
    
    0 讨论(0)
提交回复
热议问题