[racket] How can a collection in a package get its version?
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
setup/getinfo)
(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.