·
  • #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à.

Link utili: