I'm finding the behavior of leiningen new to be broken. It looks like
the initial implementation isn't clear about what exactly the project
name given as argument to lein new denotes. I'd like to fix this, but
before i hack on a patch, I'd be curious to know how this subcommand
was intended to work in the first place.

It seems like lein new really needs thee pieces of information:

(1) what directory should be created to contain the project?
(2) what should the project's name (artifactId) be?
(3) what should the project's group (groupId) be?

It seems like it's trying to synthesize this out of a single piece of
information:a string which can't decide if it's #1 or #2 and that's
not working. Also, the otherwise empty .clj file created by lein new
seems to have a mangled ns declaration.

// ben

Please feel free to skip the rant that follows if the above is
sufficiently clear.


The documentation of lein new leaves me guessing:

smit...@wesley:~/w/VJS-88$ lein help new
Create a new project skeleton.

Thus I consult the source.

The Implementation of "lein new PROJECTNAME" uses mkdirs to make the
directories for PROJECTNAME, so it stands to reason that PROJECTNAME
can be a path, not just a simple name.

;; leiningen/new.clj
(defn new [project-name & [args]]
  (.mkdirs (file project-name))
  ...

Indeed, this appears to work, but doesn't since the clj file that's
generated by default has a gibberish namespace:

smit...@wesley:~/w/VJS-88$ lein new Foo/Bar
Created new project: Foo/Bar
smit...@wesley:~/w/VJS-88$ cat Foo/Bar/src/Foo/Bar.clj
(ns Foo/Bar.core)

So simple names it is:

smit...@wesley:~/w/VJS-88$ lein new Foo
Created new project: Foo/Bar
smit...@wesley:~/w/VJS-88$ cat Foo/src/Foo.clj
(ns Foo.core)

But this still doesn't look right. Shouldn't the file be named
Foo/src/Foo/core.clj if it's going to declare its namespace as
Foo.core? How else will the classloader know where to find it?

Ok, well, let's move on and build a jar.

smit...@wesley:~/w/VJS-88/Foo$ lein jar
[INFO] snapshot org.clojure:clojure:1.1.0-alpha-SNAPSHOT: checking for
updates from internal
[INFO] snapshot org.clojure:clojure-contrib:1.0-SNAPSHOT: checking for
updates from internal
     [copy] Copying 2 files to /home/smithma/w/VJS-88/Foo/lib
smit...@wesley:~/w/VJS-88/Foo$ ls
classes  leiningen.jar  lib  project.clj  README  src  test

Oh. That's odd, the JAR is named leiningen.jar, despite the fact that
I've told lein that my project is named Foo. (Remember we've already
established that the argument to lein isn't primarily answering the
question "where do I put the project" (otherwise it would not break
when given a path). Therefore, the primary meaning of the argument
might logically be "what should the project be called.") But, clearly
that's not it, because the project just get's called "leiningen", no
matter what I ask for on the command line.

Now, to cut a long story short, it took me a while to figure out that
I could use a name-space qualified symbol as the project name a-la:
my.group.id/artifactId to get both a sane file jar file name out of
"lein jar" and a sane install location from "lein install". Is this
documented somewhere? I gleaned it from the source. (of course we
can't do that from the command line because we've established that
slashes in that context == broken).

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to