Command-line tool for symlinking directories with reusable source code into the project.
Language-agnostic. Works equally well for C++ and for HTML web-sites.
Reusing code should be simple. If I have the needed code in a directory on a local drive, I just want to include it in the project. Without packaging it as a library for distribution or messing with IDE settings.
My first thought is to create a symlink:
$ ln -s /abc/libs/mylib /abc/project/mylibNow project sees mylib as a local directory project/mylib. I can edit both project
and mylib while working on the project.
But here problems arise:
- Portability. How do I make the symlinks easy to recreate on another machine?
- Recursive local dependencies. How do I include not only
mylib, but all the dependencies ofmylib, and the dependencies of those dependencies?
The answer is depz. It reduces these tasks to a one-line command.
Get a working Python ≥3.7 and pip. You may also need a computer. Then:
$ pip3 install depzMake sure that it is installed:
$ depz --helpUpgrade it later:
$ pip3 install depz --upgrade- Specify dependencies in
depz.txt - Run the command
depz
File xxx/depz.txt lists dependencies for xxx:
/abc/myproject/depz.txtformyproject/abc/libs/mylib/depz.txtformylib
The depz.txt format:
# lines that specify local directory
# names are LOCAL dependencies
/absolute/path/to/mylib1
../libs/mylib2
~/path/mylib3
# lines that cannot be resolved to an existing
# directory are considered EXTERNAL dependencies
requests
numpy$ cd /abc/myproject
$ depzThis recursively scans /abc/myproject/depz.txt and prints all the found dependencies. Doesn't make any changes to the file system.
$ cd /abc/myproject
$ depz --relinkRemoves all the symlinks found in /abc/myproject. Adds new symlinks to the local dependent directories. Prints external dependencies.
When a project depends on local mylib, it means, it also depends on all
the dependencies of mylib. So after scanning myproject/depz.txt we will also
scan mylib/depz.txt to include its dependencies too.
When we scan /abc/myproject/depz.txt, the paths are relative to /abc/myproject. Then we found a link
to mylib and started scanning /abc/mylib/depz.txt. The paths found there are relative to /abc/mylib.
But all the symlinks will go directly into /abc/myproject.
The following examples show how the directories will be linked when running depz for /abc/project:
| File | Line | Resolves to | Creates symlink |
|---|---|---|---|
| /abc/project/depz.txt | /abc/libs/aaa | /abc/libs/aaa | /abc/project/aaa |
| /abc/project/depz.txt | ../libs/bbb | /abc/libs/bbb | /abc/project/bbb |
| /abc/libs/aaa/depz.txt | ../ccc | /abc/libs/ccc | /abc/project/ccc |
| File | Line | Resolves to | Creates symlink |
|---|---|---|---|
| /abc/project/depz.txt | /abc/libs/aaa | /abc/libs/aaa/src /abc/libs/aaa/test |
/abc/project/src/aaa /abc/project/test/aaa |
| /abc/project/depz.txt | ../libs/aaa | /abc/libs/bbb/src /abc/libs/bbb/test |
/abc/project/src/bbb /abc/project/test/bbb |
| /abc/libs/aaa/depz.txt | ../ccc | /abc/libs/ccc/src /abc/libs/ccc/test |
/abc/project/src/ccc /abc/project/test/ccc |
This is useful for frameworks with strict directory structures such as Flutter.
By default, the list of all external dependencies is simply printed to the terminal like that:
$ depz
Depz file: /abc/myproject/depz.txt
...
External dependencies: pandas numpy requestsThe -e argument causes the command to print only the list of dependencies.
$ depz -e line
pandas numpy requests[click to open] This can be useful for installing Python external dependencies
$ pip3 install $(depz -e line)Or install external dependencies and symlink local ones:
$ pip3 install $(depz -e line --relink)$ depz -e multi
pandas
numpy
requests[click to open] Sample usage for creating requirements.txt for Python
$ depz -e multi > requirements.txt