Command line tool for symlinking directories with reusable code into the project
Project description
depz
Command-line tool for symlinking directories with reusable source code into the project.
Language-agnostic.
Why
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 system?
- Recursive local dependencies. How to include not only
mylib
, but all the dependencies ofmylib
?
The answer is depz
. It reduces these tasks to a one-line command.
Install
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
Use
- Specify dependencies in
depz.txt
- Run the command
depz
Specify dependencies
File aaa/depz.txt
lists dependencies for aaa
:
/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
Run
$ 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.
Local dependencies
They are recursive
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.
Paths are relative to the current depz.txt
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
:
Default behavior
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 |
With --mode=layout
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.
External dependencies
By default, the list of all external dependencies is simply printed to the terminal like that:
$ depz
Scanning /abc/myproject/depz.txt
...
External dependencies: pandas numpy requests
The -e
argument causes the command to print only the list of dependencies.
Print in one line:
$ 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)
Print one per line:
$ depz -e multi
pandas
numpy
requests
[click to open] Sample usage for creating requirements.txt for Python
$ depz -e multi > requirements.txt
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.