Giter VIP home page Giter VIP logo

lein-tar's Introduction

What is lein-tar

How far could you take a jar if the jar was in a tar? Possibly as
far as Myanmar. Or maybe Zanzibar, if you had a car.

Package your project up as a tarball!

Formerly known as lein-release.

Installation

With Leiningen 2

Add [lein-tar "3.3.0"] to your project's :plugins.

With Leiningen 1

Add [lein-tar "1.1.2"] to your project's :dev-dependencies.

Usage

$ lein tar

Creates myproject-1.0.0.tar including your project's jar, its dependencies, and everything in pkg/. A build.clj file may also be added, containing git and/or jenkins details about the build that generated your tar.

Advanced Usage

The out of the box behavior is customizable via options in project.clj and also via the command line.

Options in project.clj

lein-tar checks project.clj for a :tar entry, and looks there for a map like the following. Of course, the entire map and all its keys are optional, none of this is required.

:tar {:uberjar true
      :format :tar-gz
      :output-dir "foobar"
      :leading-path "bazquux"}
  • :uberjar allows you to specify whether you'd prefer to have your project's uberjar in the tar, rather than the project jar and dependency jars, the default is false
  • :format allows you to build a .tar.gz (:tar-gz) or .tgz (:tgz) file, if you wish, as opposed to just a .tar (the default)
  • :output-dir determines where the tar will be generated, by default it's the project's target directory (that is, the :target-path of the project)
  • :leading-path specifies the first path component of the files in the tar, by default it's "{project-name}-{project-version}", but you can override it here

Command line options

lein-tar also accepts option command line arguments.

  • --name/-n by default, the generated file name will be something like myproject-1.0.0.tar (or whatever extension :format uses). To change that, the -n or --name argument is supported. The following will create a tar file called custom-name.tar:

    $ lein tar --name custom-name
    

Known Issues

Due to absurd limitations in the Java file API, Unix permissions inside the tarball are an approximation[1]. Executable files will be given permissions of 0755, while other files will be 0644.

[1] - to phrase it charitably.

License

Licensed under the EPL; the same license as Clojure.

lein-tar's People

Contributors

bpoweski avatar dacamo76 avatar danlarkin avatar dobladez avatar hugoduncan avatar joegallo avatar leathekd avatar technomancy avatar timethy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

lein-tar's Issues

Exception when running lein tar

After adding lein-tar to my plugins and running "lein deps" to download the jars, I get the following exception:

java.lang.RuntimeException: file name 'masques-1.0.0-SNAPSHOT/lib/target/C:/Users/mcourtney/.m2/repository/org/swinglabs/swingx/swingx-painters/1.6.3/swingx-painters-1.6.3.jar' is too long ( > 100 bytes)
at org.apache.tools.tar.TarOutputStream.putNextEntry(TarOutputStream.java:189)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)
at leiningen.tar$add_file.invoke(tar.clj:27)
at leiningen.tar$tar$fn__319.invoke(tar.clj:75)
at leiningen.tar$tar.invoke(tar.clj:71)
at clojure.lang.Var.invoke(Var.java:415)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.core$apply.invoke(core.clj:603)
at leiningen.core.main$resolve_task$fn__1606.doInvoke(main.clj:132)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:603)
at leiningen.core.main$apply_task.invoke(main.clj:167)
at leiningen.core.main$_main$fn__1665.invoke(main.clj:237)
at leiningen.core.main$_main.doInvoke(main.clj:221)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:415)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.core$apply.invoke(core.clj:601)
at clojure.main$main_opt.invoke(main.clj:324)
at clojure.main$main.doInvoke(main.clj:427)
at clojure.lang.RestFn.invoke(RestFn.java:436)
at clojure.lang.Var.invoke(Var.java:423)
at clojure.lang.AFn.applyToHelper(AFn.java:167)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.main.main(main.java:37)

Note: I'm running this in cygwin on a windows box.

FileNotFoundException after running git pack-refs

git pack-refs --all changes the .git internal structure, placing all refs in .git/packed-refs and deletes the individual files in .git/refs/. This can also be done implicitly by other commands like git gc.

The plugin will then crash as it tries to lookup a non-existing file:

(.trim (slurp (str (io/file git-dir ref-path))))

FWIW, anyone who hits this issue can work around it by unpacking refs with this script: https://github.com/tj/git-extras/blob/7f0f91b4d429a11fdaecd5ad4c03c733470b07a1/bin/git-unpack-refs

lein tar does not work for lein 2.1.1

Lein version 2.1.1

∴ lein tar
Created /home/hinmanm/safe/tannaim/target/tannaim-0.1.0-SNAPSHOT.jar
java.lang.IllegalArgumentException: No implementation of method: :as-file of protocol: #'clojure.java.io/Coercions found for class: clojure.lang.PersistentArrayMap
        at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:541)
        at clojure.java.io$fn__8496$G__8491__8501.invoke(io.clj:35)
        at clojure.java.io$file.invoke(io.clj:413)
        at leiningen.tar$add_jars.invoke(tar.clj:76)
        at leiningen.tar$tar.invoke(tar.clj:99)
        at clojure.lang.Var.invoke(Var.java:415)
        at clojure.lang.AFn.applyToHelper(AFn.java:161)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.core$apply.invoke(core.clj:619)
        at leiningen.core.main$resolve_task$fn__2165.doInvoke(main.clj:186)
        at clojure.lang.RestFn.invoke(RestFn.java:410)
        at clojure.lang.AFn.applyToHelper(AFn.java:161)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:619)
        at leiningen.core.main$apply_task.invoke(main.clj:226)
        at leiningen.core.main$_main$fn__2232.invoke(main.clj:292)
        at leiningen.core.main$_main.doInvoke(main.clj:281)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.lang.Var.invoke(Var.java:415)
        at clojure.lang.AFn.applyToHelper(AFn.java:161)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.core$apply.invoke(core.clj:617)
        at clojure.main$main_opt.invoke(main.clj:335)
        at clojure.main$main.doInvoke(main.clj:440)
        at clojure.lang.RestFn.invoke(RestFn.java:436)
        at clojure.lang.Var.invoke(Var.java:423)
        at clojure.lang.AFn.applyToHelper(AFn.java:167)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.main.main(main.java:37)

project.clj:

(defproject tannaim "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]]
  :profiles {:dev {:dependencies [[clj-http-fake "0.4.1"]]}}
  :plugins [[lein-tar "1.1.1"]]
  :resource-paths ["etc"]
  :aot [tannaim.core]
  :main tannaim.core
  :min-lein-version "2.0.0"
  :test-selectors {:default  #(not (:integration %))
                   :integration :integration
                   :all (constantly true)})

Semi-relative paths in tar file

  • tar xzf target/samza-streaming-0.1.1.tgz -C deploy/samza
    lib//Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/../lib/tools.jar: Path contains '..'
    tar: Error exit delayed from previous errors

Should use .getCanonicalPath instead of .getAbsolutePath

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.