Linda W wrote:
Having gone through this operation a few times today (replacing
inuse files). I discovered a fairly easy way that should work
on "NT" based versions of Windows (don't know about Win9x).
Windows (XP tested) allows *renaming* of inuse files. According
to the way Win-NT manages memory, it ties paging activity to
a specific file on disk by using (device,sector#,# of sectors).
Thus anything that might free up or change those sectors is
disallowed, but a file-rename operation is safe for currently
mapped "DLL's".
Thus, one could rename Cwd.dll -> .oldCwd.foo, copy the new
file into place, then setup a pending delete in the registry
with a simple command line util like "sysinternals.com"'s
"movefile" that queues up pending file operations to take
place upon reboot, i.e.: 'movefile .oldCWD.foo ""' will delete
the named file next reboot.
In short, when copying a file "src" to a target path,
before copying the file, check to see if an existing target
needs to be moved out of the way first:
if [ -f "$target"]; then
mv <tpath>/<tname> <tpath>/<tmpname>
# can try to delete it first...
rm -f <tpath>/<tmpname> || movefile <tpath>/<tmpname> ""
fi
# then copy
cp <source> <tpath+file> || "fail"
I haven't had a chance to look into it, but if this works, this looks
like possibly the best solution to me, even if it doesn't work on the
nearly antiquated Win9x/ME series.
Originally, I had narrowly conceived of this as a problem only for
Module::Build, but as pointed out, it seems to affect any client of
ExtUtils::Install. So, I agree with Yves that it should be fixed as much
as possible inside EU::Install. Who owns it now? Schwern had talked
about breaking it out:
MakeMaker Changelog:
6.30_01 Tue Aug 16 23:53:27 PDT 2005
* ExtUtils::Command, ExtUtils::Install, ExtUtils::Manifest,
ExtUtils::Mkbootstrap, ExtUtils::Mksymlists and ExtUtils::Packlist
are all now considered to be separate distributions. To avoid a
circular dependency, MakeMaker distributes its own versions but CPAN
should not index them and they will not overwrite a newer, installed
version.
I think some of those modules may already have a new maintainer, but I
can't remember which or who, and I can't find references.
Yves, this would change things somewhat from your recommendation. EU::I
would copy the old files to new names, copy in the new files, and return
a list of files that need to be deleted??? I don't believe it should
return a list of failures; rather, I think it should not be allowed to
fail--it should be able to do a complete rollback if anything fails and
then throw an exception if that doesn't break compatability.
Some details still unclear, but I like this better than the unload
library, replace, & reload method because it avoids the possiblity of
loading a new version of a dynamic library that is mismatched with the
already loaded front-end perl module. And reloading the pm file, while
possible, is just as problematic for the same reasons.
Is this sensible?
Randy.