Ben Woodcroft <[email protected]> writes:
> From 3d23171d88b9f38c90efa469f6519b52b15a1d01 Mon Sep 17 00:00:00 2001
> From: Ben Woodcroft <[email protected]>
> Date: Wed, 30 Dec 2015 10:27:33 +1000
> Subject: [PATCH] build: ruby: Remove cached gem after install.
> The .gem file stored in GEM_HOME after install is both redundant and an
> archive that stores timestamped files which makes builds non-deterministic. So
> delete it after 'gem install'.
Good idea! I don’t know if the existence of the cached gem is checked
for by any Ruby tools (bundler or the like). Is there some
documentation about this cache?
> - (zero? (apply system* "gem" "install" (first-matching-file "\\.gem$")
> - "--local" "--ignore-dependencies"
> - ;; Executables should go into /bin, not /lib/ruby/gems.
> - "--bindir" (string-append out "/bin")
> - gem-flags))))
> + (apply system* "gem" "install" gem-name
> + "--local" "--ignore-dependencies"
> + ;; Executables should go into /bin, not /lib/ruby/gems.
> + "--bindir" (string-append out "/bin")
> + gem-flags)
> + ;; Remove the cached gem file as this is unnecessary and contains
> + ;; timestamped files rendering builds not reproducible.
> + (delete-file (string-append gem-home "/cache/" gem-name))
> + #t))
I’d prefer to keep ‘(zero? ...)’ and only delete the file when the
‘system*’ call above succeeded. It would be nice if we could propagate
any bad return value from ‘system*’ to the end of the procedure.
Maybe something like this:
(and (zero? (apply system* ...))
(begin (delete-file ...) #t))
It’s a bit clunky but the return value would still be #f if ‘system*’
fails. What do you think?
~~ Ricardo