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/mylib
Now 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 depz
Make sure that it is installed:
$ depz --help
Upgrade 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.txt
formyproject
/abc/libs/mylib/depz.txt
formylib
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
$ depz
This 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 --relink
Removes 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 requests
The -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