name: Publish .NET description: > Esegue restore, publish e rsync per un progetto .NET. inputs: project: description: Path al file .csproj del progetto. required: true output-path: description: Directory di destinazione per i file pubblicati. required: true version: description: Versione applicativa da applicare (es. 1.0.0.0). required: true subpath: description: > Sottopath relativo alla cartella di publish da copiare (es. "wwwroot" per Blazor WASM). Vuoto per copiare tutto. required: false default: "" configuration: description: Configurazione di build (es. Release, Debug). required: false default: Release exclude-dirs: description: Directory da escludere dal rsync (separate da virgola, punto e virgola o newline). required: false default: store exclude-files: description: File da escludere dal rsync (separati da virgola, punto e virgola o newline). required: false default: appsettings.json runs: using: composite steps: - name: Restore shell: bash run: dotnet restore "${{ inputs.project }}" - name: Publish e rsync shell: bash run: | set -euo pipefail split_input_list() { local value="$1" if [ -z "$value" ]; then echo "" return fi echo "$value" | tr ',;\r\n' '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep -v '^$' } tmpdir=$(mktemp -d) trap 'rm -rf "$tmpdir"' EXIT dotnet publish "${{ inputs.project }}" \ -c "${{ inputs.configuration }}" \ -p:Version="${{ inputs.version }}" \ -o "$tmpdir" src="$tmpdir" if [ -n "${{ inputs.subpath }}" ]; then src="$tmpdir/${{ inputs.subpath }}" fi mkdir -p "${{ inputs.output-path }}" exclude_args=() while IFS= read -r dir; do [ -n "$dir" ] && exclude_args+=(--exclude="$dir") done < <(split_input_list "${{ inputs.exclude-dirs }}") while IFS= read -r file; do [ -n "$file" ] && exclude_args+=(--exclude="$file") done < <(split_input_list "${{ inputs.exclude-files }}") rsync -a --delete "${exclude_args[@]}" "$src/" "${{ inputs.output-path }}/"