当阅读答案时这个帖子,我想知道我们是否可以将我们计算机上经常使用的程序制作成可移植的(Windows意义上的),这样我们就可以将它们复制到我们的闪存驱动器上,这样我们就不用担心如果我们不这样做'无法访问其他计算机上我们喜欢的程序?
是否可以进行这种便携式安装?
答案1
是的,你可以这么做。这比依赖包管理器要做更多的工作——Windows 下“便携式”安装的主要吸引力在于不必与缺乏像样的包管理器的问题作斗争。
您需要安排程序找到它们的依赖项:数据文件、库等。许多程序都支持环境变量。有些检查二进制文件所在的目录,或相关目录,例如../lib
,是否有伴随文件
将软件安装在某个根目录下。在该根目录下创建常用的类别目录:bin
、lib
、man
等。要管理所有软件,请独立安装每个软件,然后使用类似的程序斯托创建符号链接林以将它们链接到类别目录。看跟踪程序了解斯托的简介。因此,您将拥有像这样的符号链接
bin/foo -> ../stow/foo-1.42/bin/foo
bin/foobar -> ../stow/foo-1.42/bin/foobar
man/man1/foo.1 -> ../../stow/foo-1.42/man/man1/foo.1
…
您需要一个脚本来设置环境变量。将其放在安装的根目录下并用于$0
查找脚本。由于脚本无法影响其父脚本,因此通常的方法是使脚本生成可由调用 shell 评估的输出。我们称这个脚本为setup.sh
。
#!/bin/sh
set -e
root=$(dirname -- "$0")
cd -- "$root"
printf "PORTABLE_ROOT='%s'\\n" "${PWD}" | sed "s/'/'\\\\''/g"
prepend () {
eval "set -- \"\$1\" \"\$2\" \"${$1}\""
case :$3: in
*:$PORTABLE_ROOT/$2:*) :;; # already there (at any location)
:: echo '$1=$PORTABLE_ROOT/$2; export $1';; # the path was empty
*) echo '$1=$PORTABLE_ROOT/$2:$3; export $1';; # prepend
esac
}
prepend PATH bin
prepend MANPATH man
prepend LD_LIBRARY_PATH lib
prepend PERL5LIB lib/perl
prepend PYTHONPATH lib/python
…
(警告:未经测试的代码)
要从 shell 使用便携式安装,请运行eval "`/path/to/setup.sh`"
。
答案2
当然。一些语言(如 Java 或 Python)实现了一定程度的可移植性,尽管它可能会因包含操作系统特定的系统调用而被击败。