Activities of "florian.neuhaus"

Not the answer I hoped for, but thanks anyway.

Hi maliming

Thanks for the suggestion. The workaround works. However: We had hoped that we could include the Theme Builder files in our shared-ui library project.

It would really help if you could introduce some sort of ‘basePath’/‘sourceRoot’ for Theme Builder files. Perhaps in *.abpsln/*.abpmdl? No UI configuration required :-) It would help to keep our project structure tidy.

Probably you could consider that. Thank you, Florian

angular.json, see shared-ui section at the end:

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "app-one": {
      "projectType": "application",
      "root": "projects/app-one",
      "sourceRoot": "projects/app-one/src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular/build:application",
          "options": {
            "outputPath": { "base": "dist/app-one" },
            "index": "projects/app-one/src/index.html",
            "polyfills": ["projects/app-one/src/polyfills.ts"],
            "tsConfig": "projects/app-one/tsconfig.app.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              "projects/app-one/src/favicon.ico",
              "projects/app-one/src/assets",
              { "glob": "**/*", "input": "projects/shared-ui/images", "output": "/images/" }
            ],
            "styles": [
              {
                "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/font-bundle.css",
                "inject": false,
                "bundleName": "font-bundle"
              },
              {
                "input": "node_modules/@volosoft/abp.ng.theme.lepton-x/assets/css/abp-bundle.css",
                "inject": false,
                "bundleName": "abp-bundle"
              },

              // ---- generated by Theme Builder: workspace-root relative, outside any sourceRoot ----
              { "input": "src/assets/styles/light.css", "inject": false, "bundleName": "light" },
              { "input": "src/assets/styles/dark.css", "inject": false, "bundleName": "dark" },
              { "input": "src/assets/styles/dim.css", "inject": false, "bundleName": "dim" },
              // ... more entries
              // ---- end Theme Builder output ----

              "projects/app-one/src/styles.scss"
            ]
          }
        },
        "serve": { "builder": "@angular/build:dev-server" },
        "test": { "builder": "@angular/build:unit-test" },
        "lint": { "builder": "@angular-eslint/builder:lint" }
      }
    },

    "app-two": {
      "projectType": "application",
      "root": "projects/app-two",
      "sourceRoot": "projects/app-two/src",
      "prefix": "pub",
      "architect": {
        "build": {
          "builder": "@angular/build:application",
          "options": {
            "outputPath": { "base": "dist/app-two" },
            "browser": "projects/app-two/src/main.ts",
            "index": "projects/app-two/src/index.html",
            "polyfills": ["projects/app-two/src/polyfills.ts"],
            "tsConfig": "projects/app-two/tsconfig.app.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              "projects/app-two/src/assets",
              { "glob": "**/*", "input": "projects/shared-ui/images", "output": "/images/" }
            ],
            "styles": [
              // same Theme Builder entries as app-one -- both apps are forced to
              // share the single workspace-root output folder
              { "input": "src/assets/styles/light.css", "inject": false, "bundleName": "light" },
              { "input": "src/assets/styles/dark.css", "inject": false, "bundleName": "dark" },
              // ... more entries

              "projects/app-two/src/styles.scss"
            ]
          }
        },
        "serve": { "builder": "@angular/build:dev-server" },
        "test": { "builder": "@angular/build:unit-test" },
        "lint": { "builder": "@angular-eslint/builder:lint" }
      }
    },

    "shared-core": {
      "projectType": "library",
      "root": "projects/shared-core",
      "sourceRoot": "projects/shared-core/src",
      "prefix": "lib",
      "architect": {
        "build": { "builder": "@angular/build:ng-packagr" },
        "test": { "builder": "@angular/build:unit-test" },
        "lint": { "builder": "@angular-eslint/builder:lint" }
      }
    },

    "shared-ui": {
      // Theme Builder entries should live here :)                             <---
      "projectType": "library",
      "root": "projects/shared-ui",
      "sourceRoot": "projects/shared-ui/src",
      "prefix": "lib",
      "architect": {
        "build": { "builder": "@angular/build:ng-packagr" },
        "test": { "builder": "@angular/build:unit-test" },
        "lint": { "builder": "@angular-eslint/builder:lint" }
      }
    }
  }
}

Hi,

Thanks for the clear answer.

To your question: our Angular side is not the single-app default template layout. It's a multi-project Angular CLI workspace (newProjectRoot: "projects") containing two ABP-based applications plus a couple of shared libraries. Each application has its own root/sourceRoot under projects/<app>/…, so the workspace root has no application of its own and no meaningful src folder.

Theme Builder writes the generated CSS to <workspace-root>/src/assets/css and <workspace-root>/src/assets/styles, and points the styles entries in angular.json at those root-relative paths. That folder is outside every project's sourceRoot, which gives us two problems:

The generated files don't live with the app that consumes them, so they aren't covered by the app's assets configuration, so we have to move them on every change in Theme Builder. We want to have the apps the same theme and share it. What would help us is if the output location followed the selected project instead of the workspace root — i.e. writing to the project's own sourceRoot (projects/<app>/src/assets/css and projects/<app>/src/assets/styles) as resolved from angular.json, and generating the styles entries accordingly. A plain configurable output path per project would work just as well for us.

Is support for such a workspace layout something you could consider on your side? Happy to provide a trimmed-down angular.json if that helps.

Thanks

<workspace-root>/
  angular.json
  package.json
  src/                      <-- problem: no application here; only Theme Builder output lands in it ...
    assets/
      css/
      styles/
  projects/
    app-one/    src/        <-- sourceRoot of application 1
    app-two/    src/        <-- sourceRoot of application 2
    shared-core/src/
    shared-ui/  src/

Hi @maliming Thanks for clarifying the release process. So then we were a little too fast. Probably you should mention this in your release blog-post. Thanks, Florian

ABP.IO 10.5 has been released final. if I do an abp update, I still receive the nuget packages from 10.4.1.

  • ABP Studio is up to date
  • CLI is up to date
  • Nuget cache has been cleared (dotnet nuget locals all --clear)

abp update [13:12:02 INF] Volo packages are updated in fullbench-dll solution [13:12:02 INF] Package: "Volo.Abp.AspNetCore.Mvc-v10.4.1" is up to date [13:12:02 INF] Package: "Volo.Abp.PermissionManagement.Application.Contracts-v10.4.1" is up to date [13:12:02 INF] Package: "Volo.Abp.BackgroundJobs.Domain.Shared-v10.4.1" is up to date [13:12:02 INF] Package: "Volo.Abp.AspNetCore.Mvc-v10.4.1" is up to date [13:12:02 INF] Package: "Volo.Abp.AspNetCore.Mvc-v10.4.1" is up to date [13:12:02 INF] Package: "Volo.Abp.EntityFrameworkCore.SqlServer-v10.4.1" is up to date ... more logs

Showing 1 to 5 of 5 entries
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.8.0-preview. Updated on October 06, 2026, 12:23
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.