For developers, combining make with shell download creates reproducible builds.
Example Makefile:
DEP_URL = https://github.com/example/cli/releases/download/v2.0/cli_linux_amd64 CHECKSUM = a3b4c5d6...bin/cli: mkdir -p bin curl -L -o bin/cli $(DEP_URL) echo "$(CHECKSUM) bin/cli" | sha256sum -c - chmod +x bin/cli shell dep download
clean: rm -rf bin
.PHONY: clean
Run make and the shell dep download happens automatically. For developers, combining make with shell download creates
if command -v apt-get &>/dev/null; then
sudo apt-get install -y curl jq
elif command -v yum &>/dev/null; then
sudo yum install -y curl jq
fi
Maven is a build automation tool for Java projects. To download dependencies using Maven:
# Initialize a new project
mvn archetype:generate
# Install dependencies
mvn clean package
| Pitfall | Symptom | Solution |
|---------|---------|----------|
| Version drift | "Module not found" | Use lockfiles and freeze versions |
| Incomplete downloads | Checksum error | Always validate checksums |
| Permission denied | Cannot write to /usr/lib | Download to user-writable directories or use sudo judiciously |
| Network flakiness | Broken pipe / timeout | Add retry logic: curl --retry 3 --retry-delay 2 |
| Missing transitive deps | Runtime import errors | Use recursive downloaders (pip download --no-deps vs default) | Run make and the shell dep download happens
Ideal for fetching single files or mirroring entire directories via HTTP/HTTPS/FTP.
wget https://example.com/lib/mylib.so -O /usr/local/lib/mylib.so
Simple downloads don’t always fetch nested dependencies. For language ecosystems, use built-in commands: