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

From: Greg Hendershott (greghendershott at gmail.com)
Date: Fri Jun 7 17:00:17 EDT 2013

Thank you. Although I was curious in general, at the moment the need
is nothing fancier than printing the version in a banner, and not
wanting to duplicate the version string. Sounds like I'll go with:

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

On Thu, Jun 6, 2013 at 7:43 PM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> 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.
>

Posted on the users mailing list.