我有一个git
包含有用的程序和脚本的项目。层次结构如下所示:
$ git clone https://github.com/myaccount/myutils.git
$ tree myutils
.
├── bash
│ ├── do-this.sh
│ ├── do-that.sh
│ ├── functions-to-source.sh # Contains useful functions that will be sourced by other scripts.
│ ├── tests
│ │ ├── bin
│ │ └── command.ext1.ext2.ext3
│ └── todo
├── python
│ ├── notes
│ └── package1
│ ├── module1.py
│ └── module2.py
└── c
├── bin
├── build
├── doc
├── include
├── lib
├── Makefile
├── src
└── test
我们还可以将每个文件夹视为一个项目。我应该如何安装我的文件/usr/local
?我想让它们成为安装在/usr/local
.我读到我们应该放入/usr/local/src
必须编译的内容。这里只需要编译C工程,那么我是否将各个子文件夹(bin、lib、src)的内容复制到相应的子文件夹中/usr/local
?那些不需要编译的脚本呢?我应该复制每个脚本吗/usr/local/bin
?或者建立一个符号链接到它们?整个项目怎么样,是否应该将其移动到某些特定文件夹中?我想了解更多关于良好(最佳?)部署实践的信息。
答案1
我建议使用GNU 斯托/opt
在目录下为任何特定于站点的软件创建层次结构(请参阅文件系统层次结构标准,尽管有些网站使用/sw
代替)。这样,你的东西就会
- [使用
/opt
] ...不与任何包管理器安装的任何内容发生冲突。 - [使用
stow
]...是真的易于安装/卸载。
对于stow
,创建目录/opt/stow
。
在此之下,为每个单独的项目创建一个完整的子层次结构,即
/opt/stow/project-1/{bin,lib,man}
/opt/stow/project-2/bin
/opt/stow/project-3/{bin,fun,share/examples}
(fun
适用于具有 shell 函数的可源 shell 代码)- ETC。
不要将 C 源代码放在那里,只放使用工具所需的东西。
然后:
$ cd /opt/stow
$ stow project-1
$ stow project-2
$ stow project-3
每次调用stow
都会使用指向正确位置的符号链接填充目录/opt
,以便您的可执行文件来自例如/opt/stow/project-1/bin
和 /opt/stow/project-2/bin
可以轻松访问/opt/bin
.
然后添加/opt/bin
到PATH
您的即可。
到卸载例如project-1
来自/opt
:
$ cd /opt/stow
$ stow -D project-1
这将从/opt
层次结构中删除所有指向 的链接/opt/stow/project-1
,但保留完整的内容/opt/stow/project-1
。
如果您的第一个项目有新版本,您可以:
$ # (having un-stowed project-1, and still in /opt/stow ...)
$ mv project-1 project-1.old
$ cp $HOME/path/project-1 ./
$ stow project-1
stow
与标志一起使用-v
来查看实际发生的情况。
基本上,GNU Stow 可以轻松地保持应用程序的单独安装分离。我一直使用它来编译和安装代码(例如$HOME/local
使用--prefix
with )。./configure
使卸载东西变得更容易。