* Initial plan * Add comprehensive GitHub Copilot instructions for Umbraco CMS development Co-authored-by: iOvergaard <752371+iOvergaard@users.noreply.github.com> * Remove hardcoded versions from copilot instructions Co-authored-by: iOvergaard <752371+iOvergaard@users.noreply.github.com> * added instructions on how to test and lint the frontend * Update .github/copilot-instructions.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * update instructions on how to disable the frontend build * Update .github/copilot-instructions.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: iOvergaard <752371+iOvergaard@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
183 lines
7.3 KiB
Markdown
183 lines
7.3 KiB
Markdown
# Umbraco CMS Development Guide
|
|
|
|
Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
|
|
|
|
## Working Effectively
|
|
|
|
Bootstrap, build, and test the repository:
|
|
|
|
- Install .NET SDK (version specified in global.json):
|
|
- `curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --version $(jq -r '.sdk.version' global.json)`
|
|
- `export PATH="/home/runner/.dotnet:$PATH"`
|
|
- Install Node.js (version specified in src/Umbraco.Web.UI.Client/.nvmrc):
|
|
- `curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash`
|
|
- `export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"`
|
|
- `nvm install $(cat src/Umbraco.Web.UI.Client/.nvmrc) && nvm use $(cat src/Umbraco.Web.UI.Client/.nvmrc)`
|
|
- Fix shallow clone issue (required for GitVersioning):
|
|
- `git fetch --unshallow`
|
|
- Restore packages:
|
|
- `dotnet restore` -- takes 50 seconds. NEVER CANCEL. Set timeout to 90+ seconds.
|
|
- Build the solution:
|
|
- `dotnet build` -- takes 4.5 minutes. NEVER CANCEL. Set timeout to 10+ minutes.
|
|
- Install and build frontend:
|
|
- `cd src/Umbraco.Web.UI.Client`
|
|
- `npm ci --no-fund --no-audit --prefer-offline` -- takes 11 seconds.
|
|
- `npm run build:for:cms` -- takes 1.25 minutes. NEVER CANCEL. Set timeout to 5+ minutes.
|
|
- Install and build Login
|
|
- `cd src/Umbraco.Web.UI.Login`
|
|
- `npm ci --no-fund --no-audit --prefer-offline`
|
|
- `npm run build`
|
|
- Run the application:
|
|
- `cd src/Umbraco.Web.UI`
|
|
- `dotnet run --no-build` -- Application runs on https://localhost:44339 and http://localhost:11000
|
|
|
|
## Validation
|
|
|
|
- ALWAYS run through at least one complete end-to-end scenario after making changes.
|
|
- Build and unit tests must pass before committing changes.
|
|
- Frontend build produces output in src/Umbraco.Web.UI.Client/dist-cms/ which gets copied to src/Umbraco.Web.UI/wwwroot/umbraco/backoffice/
|
|
- Always run `dotnet build` and `npm run build:for:cms` before running the application to see your changes.
|
|
- For login-only changes, you can run `npm run build` from src/Umbraco.Web.UI.Login and then `dotnet run --no-build` from src/Umbraco.Web.UI.
|
|
- For frontend-only changes, you can run `npm run dev:server` from src/Umbraco.Web.UI.Client for hot reloading.
|
|
- Frontend changes should be linted using `npm run lint:fix` which uses Eslint.
|
|
|
|
## Testing
|
|
|
|
### Unit Tests (.NET)
|
|
- Location: tests/Umbraco.Tests.UnitTests/
|
|
- Run: `dotnet test tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj --configuration Release --verbosity minimal`
|
|
- Duration: ~1 minute with 3,343 tests
|
|
- NEVER CANCEL: Set timeout to 5+ minutes
|
|
|
|
### Integration Tests (.NET)
|
|
- Location: tests/Umbraco.Tests.Integration/
|
|
- Run: `dotnet test tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj --configuration Release --verbosity minimal`
|
|
- NEVER CANCEL: Set timeout to 10+ minutes
|
|
|
|
### Frontend Tests
|
|
- Location: src/Umbraco.Web.UI.Client/
|
|
- Run: `npm test` (requires `npx playwright install` first)
|
|
- Frontend tests use Web Test Runner with Playwright
|
|
|
|
### Acceptance Tests (E2E)
|
|
- Location: tests/Umbraco.Tests.AcceptanceTest/
|
|
- Requires running Umbraco application and configuration
|
|
- See tests/Umbraco.Tests.AcceptanceTest/README.md for detailed setup (requires `npx playwright install` first)
|
|
|
|
## Project Structure
|
|
|
|
The solution contains 30 C# projects organized as follows:
|
|
|
|
### Main Application Projects
|
|
- **Umbraco.Web.UI**: Main web application project (startup project)
|
|
- **Umbraco.Web.UI.Client**: TypeScript frontend (backoffice)
|
|
- **Umbraco.Web.UI.Login**: Separate login screen frontend
|
|
- **Umbraco.Core**: Core domain models and interfaces
|
|
- **Umbraco.Infrastructure**: Data access and infrastructure
|
|
- **Umbraco.Cms**: Main CMS package
|
|
|
|
### API Projects
|
|
- **Umbraco.Cms.Api.Management**: Management API
|
|
- **Umbraco.Cms.Api.Delivery**: Content Delivery API
|
|
- **Umbraco.Cms.Api.Common**: Shared API components
|
|
|
|
### Persistence Projects
|
|
- **Umbraco.Cms.Persistence.SqlServer**: SQL Server support
|
|
- **Umbraco.Cms.Persistence.Sqlite**: SQLite support
|
|
- **Umbraco.Cms.Persistence.EFCore**: Entity Framework Core abstractions
|
|
|
|
### Test Projects
|
|
- **Umbraco.Tests.UnitTests**: Unit tests
|
|
- **Umbraco.Tests.Integration**: Integration tests
|
|
- **Umbraco.Tests.AcceptanceTest**: End-to-end tests with Playwright
|
|
- **Umbraco.Tests.Common**: Shared test utilities
|
|
|
|
## Common Tasks
|
|
|
|
### Frontend Development
|
|
For frontend-only changes:
|
|
1. Configure backend for frontend development:
|
|
```json
|
|
<!-- Add to src/Umbraco.Web.UI/appsettings.json under Umbraco:Cms:Security: -->
|
|
```json
|
|
"BackOfficeHost": "http://localhost:5173",
|
|
"AuthorizeCallbackPathName": "/oauth_complete",
|
|
"AuthorizeCallbackLogoutPathName": "/logout",
|
|
"AuthorizeCallbackErrorPathName": "/error"
|
|
```
|
|
2. Run backend: `cd src/Umbraco.Web.UI && dotnet run --no-build`
|
|
3. Run frontend dev server: `cd src/Umbraco.Web.UI.Client && npm run dev:server`
|
|
|
|
### Backend-Only Development
|
|
For backend-only changes, disable frontend builds:
|
|
- Comment out the target named "BuildStaticAssetsPreconditions" in src/Umbraco.Cms.StaticAssets.csproj:
|
|
```
|
|
<!--<Target Name="BuildStaticAssetsPreconditions" BeforeTargets="AssignTargetPaths">
|
|
[...]
|
|
</Target>-->
|
|
```
|
|
- Remember to uncomment before committing
|
|
|
|
### Building NuGet Packages
|
|
To build custom NuGet packages for testing:
|
|
```bash
|
|
dotnet pack -c Release -o Build.Out
|
|
dotnet nuget add source [Path to Build.Out folder] -n MyLocalFeed
|
|
```
|
|
|
|
### Regenerating Frontend API Types
|
|
When changing Management API:
|
|
```bash
|
|
cd src/Umbraco.Web.UI.Client
|
|
npm run generate:server-api-dev
|
|
```
|
|
Also update OpenApi.json from /umbraco/swagger/management/swagger.json
|
|
|
|
## Database Setup
|
|
|
|
Default configuration supports SQLite for development. For production-like testing:
|
|
- Use SQL Server/LocalDb for better performance
|
|
- Configure connection string in src/Umbraco.Web.UI/appsettings.json
|
|
|
|
## Clean Up / Reset
|
|
|
|
To reset development environment:
|
|
```bash
|
|
# Remove configuration and database
|
|
rm src/Umbraco.Web.UI/appsettings.json
|
|
rm -rf src/Umbraco.Web.UI/umbraco/Data
|
|
|
|
# Full clean (removes all untracked files)
|
|
git clean -xdf .
|
|
```
|
|
|
|
## Version Information
|
|
|
|
- Target Framework: .NET (version specified in global.json)
|
|
- Current Version: (specified in version.json)
|
|
- Node.js Requirement: (specified in src/Umbraco.Web.UI.Client/.nvmrc)
|
|
- npm Requirement: Latest compatible version
|
|
|
|
## Known Issues
|
|
|
|
- Build requires full git history (not shallow clone) due to GitVersioning
|
|
- Some NuGet package security warnings are expected (SixLabors.ImageSharp vulnerabilities)
|
|
- Frontend tests require Playwright browser installation: `npx playwright install`
|
|
- Older Node.js versions may show engine compatibility warnings (check .nvmrc for current requirement)
|
|
|
|
## Timing Expectations
|
|
|
|
**NEVER CANCEL** these operations - they are expected to take time:
|
|
|
|
| Operation | Expected Time | Timeout Setting |
|
|
|-----------|--------------|-----------------|
|
|
| `dotnet restore` | 50 seconds | 90+ seconds |
|
|
| `dotnet build` | 4.5 minutes | 10+ minutes |
|
|
| `npm ci` | 11 seconds | 30+ seconds |
|
|
| `npm run build:for:cms` | 1.25 minutes | 5+ minutes |
|
|
| `npm test` | 2 minutes | 5+ minutes |
|
|
| `npm run lint` | 1 minute | 5+ minutes |
|
|
| Unit tests | 1 minute | 5+ minutes |
|
|
| Integration tests | Variable | 10+ minutes |
|
|
|
|
Always wait for commands to complete rather than canceling and retrying. |