- #golang
- #cli
- #tooling
- #filesystem
Implementazione del tool CLI Project Scanner in Go
Dettagli di implementazione del tool Go per scansionare directory locali e identificare progetti
-3 min read
Nel post precedente abbiamo definito il problema di ritrovare velocemente i progetti locali sparsi nel filesystem. In questo articolo entriamo nel dettaglio dell’implementazione del tool chiamato Project Scanner, un piccolo strumento CLI in Go che lo risolve in modo semplice e pratico.
Obiettivo dell’implementazione
L’obiettivo è fornire una utility che:
- legge percorsi da scansionare da un file di configurazione YAML
- attraversa ricorsivamente le directory specificate
- identifica le cartelle che contengono progetti rilevanti
- stampa una lista leggibile di progetti riconosciuti
Il tutto mantenendo il tool:
- semplice da capire
- facile da eseguire
- veloce da usare
- senza dipendenze pesanti
Struttura del progetto
La struttura del progetto è pensata per essere minimale:
project-scanner/
├─ main.go
├─ config.yaml
├─ scanner/
│ └─ scanner.go
├─ go.mod
└─ go.sum
Questa struttura aiuta a mantenere separata la logica della scansione dal punto di ingresso principale.
Configurazione
Il file config.yaml permette di definire quali directory analizzare:
paths:
- /absolute/path/one
- /absolute/path/two
Il tool leggerà questi percorsi ed eseguirà la scansione.
Rilevamento dei progetti
Il cuore del progetto è la funzione che controlla se una cartella contiene un progetto. Il tuo scanner oggi identifica vari tipi di progetto in ordine di priorità: prima quelli specifici (es. Go), poi quelli più generici (es. Git).
Tipi di progetti riconosciuti
I progetti vengono classificati così:
- Go:
go.mod,go.sum - Node:
package.json,package-lock.json,yarn.lock - Python:
requirements.txt,pyproject.toml,setup.py,Pipfile, o.py - DotNet:
.csproj,.sln - Rust:
Cargo.toml,Cargo.lock - Java:
pom.xml,build.gradle, o.java - Git generico:
.git directory(bassa priorità)
Questa priorità è importante: se una cartella contiene entrambi un
file .git e un go.mod, verrà classificata come Go.
Scansione ricorsiva
La scansione si basa su filepath.WalkDir, che visita ogni directory in
maniera ricorsiva. Quando viene trovata una cartella che corrisponde a un
tipo di progetto, la scansione non entra più in profondità in quella
cartella — garantendo efficienza e chiarezza nei risultati.
Output a terminale
Il formato dell’output è semplice e tab-separato, ideale per essere analizzato o pipe-ato in altri strumenti:
Go /home/user/projects/my-go-app
Node /home/user/projects/frontend
Python /home/user/projects/ml-experiment
DotNet /home/user/projects/web-api
Rust /home/user/projects/cli-tool
Java /home/user/projects/spring-app
Git /home/user/experiments/old-project
Questo formato permette di:
- comprendere subito il tipo di progetto
- vedere il percorso completo
- usarlo in altri workflow di shell se necessario
Note e limiti
Questa implementazione è volutamente semplice:
- Non effettua caching dei risultati
- Non supporta filtri complessi
- Fa una scansione completa di ogni directory
- Non è pensato per directory enormi (potrebbe essere lento)
Tuttavia è già utile se:
- lavori localmente su molti progetti
- vuoi una panoramica veloce di cosa hai e dove
- non vuoi dipendere da strumenti più pesanti
Conclusione
Project Scanner è un esempio di come una piccola utility può risolvere un problema personale reale senza complicazioni inutili. È una soluzione pragmatica, replicabile e facilmente estendibile in futuro se ne sentirai la necessità.