> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Come creare uno starter kit per Laravel

> Il flusso pratico per creare uno starter kit Laravel, pubblicarlo su Packagist e mantenerlo aggiornato con le nuove versioni di Laravel e del frontend.

## Introduzione

Uno starter kit è un progetto template che viene espanso con `create-project` quando crei un'applicazione con `laravel new`. Gli starter kit ufficiali di Laravel 13 sono quattro — React / Vue / Svelte / Livewire — e includono autenticazione e UI iniziale.

Quando crei il tuo starter kit personalizzato fai la stessa cosa: parti da un'applicazione Laravel, la sistemi e la pubblichi come pacchetto Composer.

* Documentazione ufficiale: [Starter Kits](https://laravel.com/docs/starter-kits)
* Esempio ufficiale: [laravel/react-starter-kit](https://github.com/laravel/react-starter-kit)
* Pagina di riferimento: [Laravel Console Starter](/it/packages/laravel-console-starter/index)

## Creare lo starter kit

### Inizializzare il progetto Laravel

Per prima cosa crei il progetto Laravel che farà da template e ripulisci il codice di esempio superfluo. Poi assegni a `name` in `composer.json` un nome di pacchetto univoco.

```json theme={null}
{
    "name": "example/starter-kit",
    "type": "project",
    "require": {
        "php": "^8.3",
        "laravel/framework": "^13.0"
    }
}
```

Questo `name` è l'identificatore che verrà usato poi con `laravel new my-app --using=example/starter-kit`.

### Configurare gli scripts di composer.json

Dopo l'esecuzione di `laravel new`, gli script Composer dello starter kit vengono utilizzati nel flusso di inizializzazione. Assicurati almeno che siano presenti `post-root-package-install` e `post-create-project-cmd`.

```json theme={null}
"scripts": {
    "post-root-package-install": [
        "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
    ],
    "post-create-project-cmd": [
        "@php artisan key:generate --ansi",
        "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
        "@php artisan migrate --graceful --ansi"
    ]
}
```

Questo esempio è basato sul [composer.json di laravel/react-starter-kit](https://github.com/laravel/react-starter-kit/blob/main/composer.json). Se il tuo kit usa un database, puoi riutilizzarlo così com'è.

### Controllare i file distribuiti con .gitattributes

Con `export-ignore` escludi i file che vuoi tenere nel repository dello starter kit ma non nel progetto generato dell'utente.

```gitattributes theme={null}
LICENSE export-ignore
composer.lock export-ignore
README.md export-ignore
```

Per i dettagli consulta l'[esempio ufficiale di .gitattributes](https://github.com/laravel/react-starter-kit/blob/main/.gitattributes).

## Registrazione su Packagist

Per permettere agli utenti di usarlo con `--using` è necessaria la registrazione su Packagist.

<Steps>
  <Step title="Prepara un repository pubblico su GitHub">
    Rendi coerenti il `name` di `composer.json` e l'URL del repository, poi pubblica.
  </Step>

  <Step title="Registra su Packagist">
    Registra il repository su [Packagist](https://packagist.org/). Dopo la pubblicazione, `example/starter-kit` diventa risolvibile.
  </Step>

  <Step title="Indica il comando d'uso nel README">
    Documenta per gli utenti il comando di installazione:

    ```bash theme={null}
    laravel new my-app --using=example/starter-kit
    ```
  </Step>
</Steps>

## Flusso del comando laravel new

Il `NewCommand` di `laravel/installer`, quando è indicato uno starter kit, cambia la destinazione di `create-project` ed esegue in sequenza i comandi di inizializzazione.

```mermaid theme={null}
flowchart TD
    A["laravel new my-app --using=example/starter-kit"] --> B["Determina il nome del pacchetto con getStarterKit()"]
    B --> C["composer create-project example/starter-kit my-app"]
    C --> D["composer run post-root-package-install -d my-app"]
    D --> E["Processi di inizializzazione come artisan key:generate"]
    E --> F["Se necessario esegue migrate / npm install"]
```

Punti da controllare in [NewCommand.php](https://github.com/laravel/installer/blob/master/src/NewCommand.php):

* [Definizione dell'opzione --using](https://github.com/laravel/installer/blob/958a4e7c1386199a63d3c5e49a18b2e5c2ad1600/src/NewCommand.php#L119)
* [Esecuzione di `create-project` e `post-root-package-install`](https://github.com/laravel/installer/blob/958a4e7c1386199a63d3c5e49a18b2e5c2ad1600/src/NewCommand.php#L521-L569)
* [Implementazione di `getStarterKit()`](https://github.com/laravel/installer/blob/958a4e7c1386199a63d3c5e49a18b2e5c2ad1600/src/NewCommand.php#L1237-L1255)

## Scelta del framework frontend

Gli starter kit ufficiali di Laravel 13 offrono React / Vue / Svelte / Livewire, ma il tuo starter kit personalizzato non deve necessariamente adeguarsi a questa configurazione. Puoi scegliere liberamente CSS, component library e metodo di autenticazione in base ai tuoi obiettivi.

| Opzione                                   | Configurazione tipica                               | Casi adatti                                            |
| ----------------------------------------- | --------------------------------------------------- | ------------------------------------------------------ |
| Ufficiali React / Vue / Svelte / Livewire | Configurazione ufficiale con Inertia 3 o Livewire 4 | Offrire un'esperienza di sviluppo vicina all'ufficiale |
| Frontend personalizzato                   | CSS e component library a piacere                   | Riusare un design system esistente o un'altra base CSS |
| Kit Blade semplice                        | Prevalenza di Blade, dipendenze frontend minime     | Una configurazione leggera e rapida da introdurre      |
| Kit di autenticazione personalizzato      | Non limitato a Fortify (es.: centrato su Socialite) | Restringere a un metodo di autenticazione specifico    |

<Info>
  Gli starter kit della community di solito adottano basi CSS diverse dall'ufficiale. Anche l'autenticazione non deve necessariamente basarsi su Fortify: progettala in funzione dei tuoi requisiti.
</Info>

## Manutenzione tra versioni

Uno starter kit non è "fatto e finito". Va aggiornato in modo continuo per stare al passo con Laravel e PHP.

### Aggiornamento a nuove versioni di Laravel e PHP

Aggiorna i requisiti in `composer.json` e verifica la compatibilità in CI.

```json theme={null}
"require": {
    "php": "^8.3",
    "laravel/framework": "^13.0"
}
```

Con gli aggiornamenti major di Laravel, rivedi contestualmente `laravel/framework` e le dipendenze correlate.

### Aggiornamento periodico dei pacchetti

Le dipendenze frontend cambiano rapidamente, quindi è più sicuro attivare un task di aggiornamento mensile.

* Tailwind
* Component library (shadcn/ui, shadcn-vue, shadcn-svelte, Flux UI)
* Pacchetti Inertia / Livewire

### Test di compatibilità

Includi almeno queste verifiche in CI.

* `composer install` va a buon fine
* `php artisan test` passa
* `npm install && npm run build` passa

## Buone pratiche

* **Fissa `name` presto**: dopo la pubblicazione su Packagist, cambiarlo ha un costo elevato.
* **Basati sugli script ufficiali**: rompere il flusso di inizializzazione aumenta i fallimenti di installazione.
* **Definisci subito `.gitattributes`**: riduci il rumore durante la distribuzione del template.
* **Rendi periodici gli aggiornamenti**: crea un'operatività che segua rapidamente le release di Laravel.
* **Leggi le guide correlate**: [Sviluppo di pacchetti Laravel](/it/advanced/package-development) e [Gestire la compatibilità tra versioni dei pacchetti](/it/advanced/package-versioning) rendono il design più stabile.


## Related topics

- [Laravel Chisel — libreria di script post-installazione per starter kit](/it/blog/chisel-introduction.md)
- [Laravel Maestro — l'orchestratore per lo sviluppo degli starter kit](/it/blog/maestro-introduction.md)
- [Starter kit](/it/starter-kits.md)
- [Laravel Fortify e gli starter kit](/it/advanced/fortify.md)
- [Laravel Console Starter](/it/packages/laravel-console-starter/index.md)
