我有一个 C#/Angular 17 SPA 项目,在具有多个部署槽的 Azure 应用服务上的 Docker 容器中运行。基本上,生产槽加载标记为“latest-prod”的图像,而暂存槽加载标记为“latest-staging”的图像。容器由 Azure DevOps 中的 YAML 管道自动构建。
我的 angular.json 文件包含用于登台(以及生产和开发)的配置以及environment.ts所需的文件替换(请参阅Angular文档):
"configurations": {
"staging": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.staging.ts"
}
],
"outputHashing": "all"
},
"defaultConfiguration": "production"
}
我的管道构建过程如下所示:
displayName: Build and push image
steps:
- script: |
cd ClientApp
npm install
npm install -g @angular/cli
ng build --configuration=staging
grep -q "staging" src/main* && echo "String found" || echo "String not found"
如您所见,我检查最终版本是否存在
environment.staging.ts
文件中的字符串“staging”,如下所示:
environment: "staging",
在管道中,脚本打印
"String not found"
但是,我在我的机器上本地运行了
ng build --configuration=staging
。在本地运行 grep
显示 "String found"
所以看起来文件替换在本地工作得很好,但在管道内却不行。
关于如何进行有什么建议吗?
感谢所有的建议,解决方案非常简单:该项目是在 Docker 文件中构建的,我从管道环境中复制了 Angular 构建到错误的位置。这解决了问题(注意我最初复制构建的注释掉的副本):
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80 443 8000 2222
ENV ASPNETCORE_URLS=https://+:443;http://+:80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
RUN apt-get update && \
apt-get install -y wget && \
apt-get install -y gnupg2 && \
wget -qO- https://deb.nodesource.com/setup_18.x | bash - && \
apt-get install -y build-essential nodejs
WORKDIR /src
COPY ["MyProject.csproj", "./"]
RUN dotnet restore "MyProject.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyProject.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyProject.csproj" -c Release -o /app/publish /p:UseAppHost=false
###COPY ClientApp/dist /app/publish/ClientApp/
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY ClientApp/dist /app/wwwroot
ENTRYPOINT ["dotnet", "MyProject.dll"]