0

我找不到任何关于如何将 Blazor Web 程序集应用程序作为静态站点部署到 GitLab Pages 的指南。有没有人设法为 .NET 6 做到这一点?

我创建了一个示例 Web 程序集 Blazor 客户端应用程序:

https://gitlab.com/sunnyatticsoftware/sasw-community/sasw-editor

创建这个简单的 Web 程序集的步骤是:

  1. 安装 .NET 6 SDK
  2. 创建回购并克隆它(例如sasw-editor:)
  3. 使用 Web 程序集 Blazor 项目创建解决方案
    dotnet new gitignore
    dotnet new blazorwasm --name Sasw.Editor.Web --output src/Sasw.Editor.Web --no-https
    dotnet new sln
    dotnet sln add src/Sasw.Editor.Web
    
  4. 编译并运行它
    dotnet build
    dotnet run --project src/Sasw.Editor.Web
    

这是在定义的端口上运行 blazor 应用程序的一种方式launchsettings.json

Building...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5291
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\src\sasw-editor\src\Sasw.Editor.Web

我阻止它。与红隼一起食用时效果很好。

现在,发布分发文件夹的过程是这样的

dotnet publish -c Release -o publish

所有工件和文件现在都在publish文件夹下。所以,理论上,我可以用一个简单的网络服务器来提供这些东西。我安装了一个名为的基本 Web 服务器工具local-web-server(它需要 NodeJs/npm,但您可以使用任何其他 Web 服务器)

npm install -g local-web-server

现在我导航到publish/wwwroot我所在的文件夹并在那里index.html启动 Web 服务器

ws
Listening on http://5CD013DP5L:8000, http://192.168.1.13:8000, http://127.0.0.1:8000, http://172.21.208.1:8000

如果我打开浏览器http://127.0.0.1:8000或以上任何其他 url,我可以看到我的 Blazor wasm 应用程序运行良好。

我想在 GitLab 页面中托管相同publish的文件夹,理论上,它能够提供静态文件。

所以我创建了一个.gitlab-ci.yml用于编译、发布和复制内容到 GitLab 页面的公共文件夹。

image: mcr.microsoft.com/dotnet/sdk:6.0

variables:
  GIT_DEPTH: 1000
  PUBLISH_OUTPUT_DIR: publish

stages:
  - build
  - test
  - publish
  - delivery

build:
  stage: build
  script:
    - dotnet restore --no-cache --force
    - dotnet build --configuration Release --no-restore
  artifacts:
    paths:
    - test
    expire_in: 8 hour
  rules:
    - if: $CI_COMMIT_TAG
      when: never  
    - when: always

test:
  stage: test
  script: dotnet test --blame --configuration Release
  allow_failure: false
  rules:
    - if: $CI_COMMIT_TAG
      when: never  
    - exists:
      - test/**/*Tests.csproj

publish:
  stage: publish
  script:
    - dotnet publish -c Release -o $PUBLISH_OUTPUT_DIR
  artifacts:
    paths: 
      - $PUBLISH_OUTPUT_DIR/
    expire_in: 8 hour
  rules:
    - if: $CI_COMMIT_TAG
      when: never  
    - when: on_success

pages:
  stage: delivery
  script:
    - cp -a $PUBLISH_OUTPUT_DIR/ public
  artifacts:
    paths:
    - public
  only:
  - main

管道成功完成。我可以在文件夹中看到与本地完全相同的结构publish,这次是public在 GitLab 的文件夹下

但它无法呈现应用程序 https://sunnyatticsoftware.gitlab.io/-/sasw-community/sasw-editor/-/jobs/1846501612/artifacts/public/wwwroot/index.html

节目

Loading...
An unhandled error has occurred. Reload  

我可以看到它正在尝试访问https://sunnyatticsoftware.gitlab.io/https://sunnyatticsoftware.gitlab.io/favicon.ico返回404

favicon.ico存在于https://sunnyatticsoftware.gitlab.io/-/sasw-community/sasw-editor/-/jobs/1846501612/artifacts/public/wwwroot/favicon.ico

所以一定是某种 URL 重写问题,对吧?

任何帮助将非常感激。

4

2 回答 2

0

解决方案是简单地使用以下

pages:
  stage: delivery
  script:
    - cp -a $PUBLISH_OUTPUT_DIR/wwwroot public
  artifacts:
    paths:
    - public
  only:
  - main

并将<base href="/sasw-community/sasw-editor/" />inindex.html与相对路径一起使用。

我在 youtube 上录制了一个快速教程https://youtu.be/c5nTDhHDnFg

请参阅带有完整示例的https://gitlab.com/sunnyatticsoftware/training/blazorwasm-pages

我仍然不知道将本地开发的基础/相对路径与产品基础混合/sasw-community/sasw-editor/并动态更改它的好方法(甚至可能吗?)

但是问题解决了。

于 2021-12-03T16:28:05.607 回答
0

始终保持不变,base href="/"然后在您的 ci 中将其更改为您需要的任何内容。例如,在 gitlab 上,您可以使用该CI_PROJECT_NAME变量。

pages:
  stage: deploy
  variables:
    SED_COMMAND: 's#<base\shref="\/"\s?\/>#<base href="\/$CI_PROJECT_NAME\/" \/>#g'
  script:
    - cp -a $PUBLISH_OUTPUT_DIR/wwwroot public
    - sed -r -i "$SED_COMMAND" public/index.html
  artifacts:
    paths:
    - public
  only:
    - main
于 2022-01-10T18:00:12.280 回答