# ✅ SQL Files Not Included in Publish - Solution
## Problem
When publishing Jellyfin, the SQL files in the `sql/` directory are not being included in the publish output.
## Root Cause
MSBuild's content copy behavior is tricky with `dotnet publish`. The files need special handling to be included in the publish directory.
## ✅ Solution: Manual Copy Post-Publish
Since the automatic copy isn't working reliably, here's a simple post-publish script:
### Option 1: PowerShell Script (Recommended)
Create `copy-sql-files.ps1` in the project root:
```powershell
# copy-sql-files.ps1
# Run this after publish to copy SQL files
param(
[string]$PublishDir = "Jellyfin.Server\bin\Release\net11.0\publish"
)
Write-Host "Copying SQL files to $PublishDir..." -ForegroundColor Cyan
# Create sql directory
New-Item -ItemType Directory -Path "$PublishDir\sql" -Force | Out-Null
New-Item -ItemType Directory -Path "$PublishDir\sql\schema_init" -Force | Out-Null
# Copy SQL files
Copy-Item "Jellyfin.Server\sql\*.sql" "$PublishDir\sql\" -Force
Copy-Item "Jellyfin.Server\sql\schema_init\*.sql" "$PublishDir\sql\schema_init\" -Force -ErrorAction SilentlyContinue
Write-Host "✓ SQL files copied successfully!" -ForegroundColor Green
# List copied files
Get-ChildItem "$PublishDir\sql" -Recurse -File | Select-Object Name, Length
```
**Usage:**
```powershell
# After publishing
dotnet publish Jellyfin.Server\Jellyfin.Server.csproj -c Release
# Copy SQL files
.\copy-sql-files.ps1
```
### Option 2: Batch Script
Create `copy-sql-files.bat`:
```batch
@echo off
SET PUBLISH_DIR=Jellyfin.Server\bin\Release\net11.0\publish
echo Copying SQL files to %PUBLISH_DIR%...
mkdir "%PUBLISH_DIR%\sql" 2>nul
mkdir "%PUBLISH_DIR%\sql\schema_init" 2>nul
copy /Y "Jellyfin.Server\sql\*.sql" "%PUBLISH_DIR%\sql\" >nul
copy /Y "Jellyfin.Server\sql\schema_init\*.sql" "%PUBLISH_DIR%\sql\schema_init\" 2>nul >nul
echo SQL files copied successfully!
dir "%PUBLISH_DIR%\sql" /B
```
### Option 3: Automated in Publish Command
Create a combined script that does both:
```powershell
# publish-with-sql.ps1
Write-Host "Publishing Jellyfin..." -ForegroundColor Cyan
dotnet publish Jellyfin.Server\Jellyfin.Server.csproj -c Release -o Jellyfin.Server\bin\Release\net11.0\publish
if ($LASTEXITCODE -eq 0) {
Write-Host "✓ Publish successful" -ForegroundColor Green
Write-Host "Copying SQL files..." -ForegroundColor Cyan
$publishDir = "Jellyfin.Server\bin\Release\net11.0\publish"
New-Item -ItemType Directory -Path "$publishDir\sql" -Force | Out-Null
New-Item -ItemType Directory -Path "$publishDir\sql\schema_init" -Force | Out-Null
Copy-Item "Jellyfin.Server\sql\*.sql" "$publishDir\sql\" -Force
Copy-Item "Jellyfin.Server\sql\schema_init\*.sql" "$publishDir\sql\schema_init\" -Force -ErrorAction SilentlyContinue
Write-Host "✓ SQL files copied" -ForegroundColor Green
Write-Host "`nPublish complete at: $publishDir" -ForegroundColor Cyan
Get-ChildItem "$publishDir\sql" -Recurse | Select-Object FullName
} else {
Write-Host "❌ Publish failed" -ForegroundColor Red
}
```
**Usage:**
```powershell
.\publish-with-sql.ps1
```
## ✅ Solution: Fix .csproj (Alternative)
If you want to fix it properly in the .csproj, use this configuration:
### Edit `Jellyfin.Server\Jellyfin.Server.csproj`
Add this **before** the closing `` tag:
```xml
Always
Always
false
```
Then rebuild:
```powershell
dotnet clean Jellyfin.Server\Jellyfin.Server.csproj -c Release
dotnet build Jellyfin.Server\Jellyfin.Server.csproj -c Release
```
## Verification
After publishing, verify SQL files are present:
```powershell
# Check if files exist
Test-Path "Jellyfin.Server\bin\Release\net11.0\publish\sql\all_performance_indexes.sql"
# List all SQL files
Get-ChildItem "Jellyfin.Server\bin\Release\net11.0\publish\sql" -Recurse | Select-Object FullName
```
Expected output:
```
FullName
--------
E:\Projects\pgsql-jellyfin\Jellyfin.Server\bin\Release\net11.0\publish\sql\all_performance_indexes.sql
E:\Projects\pgsql-jellyfin\Jellyfin.Server\bin\Release\net11.0\publish\sql\add_base_performance_indexes.sql
E:\Projects\pgsql-jellyfin\Jellyfin.Server\bin\Release\net11.0\publish\sql\diagnostics.sql
...
```
## Quick Test
```powershell
# Publish
dotnet publish Jellyfin.Server\Jellyfin.Server.csproj -c Release
# Copy SQL
.\copy-sql-files.ps1
# Verify
dir "Jellyfin.Server\bin\Release\net11.0\publish\sql"
# Should see:
# all_performance_indexes.sql
# add_base_performance_indexes.sql
# diagnostics.sql
# schema_init\
```
## Files to Create
1. ✅ `copy-sql-files.ps1` - PowerShell copy script
2. ✅ `copy-sql-files.bat` - Batch copy script
3. ✅ `publish-with-sql.ps1` - Combined publish + copy script
All three scripts are provided above. Choose whichever fits your workflow!
## Summary
**Quick Fix:** Use `publish-with-sql.ps1` - one command does everything
**Best Fix:** Update .csproj with the Target shown above - automatic and permanent
The SQL files will be at:
```
publish/
└── sql/
├── all_performance_indexes.sql
├── add_base_performance_indexes.sql
├── diagnostics.sql
└── schema_init/
└── 10_create_supplementary_indexes.sql
```
And the `PostgresDatabaseProvider` will find them automatically at startup! 🎉