[racket] How can a collection in a package get its version?

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Thu Jun 6 19:43:35 EDT 2013

At Mon, 3 Jun 2013 13:57:53 -0400, Greg Hendershott wrote:
> Let's say I have a command-line utility distributed as a package.
> package/
>   info.rkt
>   collection/
>     main.rkt
> package/info.rkt is e.g.
>     #lang setup/infotab
>     (define version "1.1")
> In main.rkt, I want to display the version to the user.
> From cheating and looking at the expansion of info.rkt, this works:
>     (require "../info.rkt")
>     (displayln (#%info-lookup 'version))
> But that seems too raw. From searching the docs, eventually I found
> `get-info/full`, which I guess would work like this:
>     (require setup/getinfo racket/runtime-path)
>     (define-runtime-path up "..")
>     (define lookup (get-info/full up))
>     (and lookup (lookup 'version (const "unknown")))
> Is that the best way?

A problem with `(define-runtime-path up "..")' is that you'd end up
with a copy of the package directory if you make a executable that
uses the "main.rkt" module.

Your initial approach,

     (require "../info.rkt")
     (displayln (#%info-lookup 'version))

seems better to me. I think `setup/infotab' should document that it
makes the module export a `#%info-lookup' function, and then you'd be
on firmer ground to use it directly.

Using a relative path "../info.rkt" that steps outside a collection
feels wrong, but I don't have a concrete reason or better idea.

One more possibility is to get the version of a collection's package,
like this:

 #lang racket/base
 (require pkg/lib

 (define (version-of-package-of-collection coll)
   (define pkg (path->pkg (collection-path coll)))
   (and pkg
        (let ([i (get-info/full (pkg-directory pkg))])
          (and i
               (i 'version (lambda () #f))))))

but I think that's more dynamic and global than you want.

Posted on the users mailing list.