• Hello Playwright:(2)简化部署方式


    前言

    上次的文章发表后,有网友留言问,有不有简化部署的方式:

    下面,提供 2 种可行的方案。

    方案 1. Copy

    其实 Playwright 默认是到C:\Users\用户名\AppData\Local\ms-playwright文件夹下查找依赖的浏览器,我们只需将本机文件夹复制到部署机器的对应文件夹即可。

    但更简便的方式,是将浏览器也放到发布文件夹下一起部署。

    具体做法如下:

    • 修改代码,设置查找依赖浏览器路径的环境变量:

    1. static async Task Main(string[] args)
    2. {
    3.     Environment.SetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ms-playwright"));
    4.     var playwright = await Playwright.CreateAsync();
    5.     ...
    6. }
    • 修改项目文件,设置发布时执行 Task,复制 ms-playwright 文件夹到发布文件夹下:

    1. <Target Name="PublishPlaywright" AfterTargets="Publish">
    2.     <ItemGroup>
    3.         <PlaywrightFiles Include="$(LOCALAPPDATA)\ms-playwright\**\*.*" />
    4.         
    5.     </ItemGroup>
    6.     <Copy
    7.             SourceFiles="@(PlaywrightFiles)"
    8.                 DestinationFiles="$(PublishDir)\ms-playwright\%(RecursiveDir)%(Filename)%(Extension)"
    9.         />
    10. </Target>
    • 按照正常流程发布

    现在将发布文件夹复制到另一台机器上,无需运行浏览器安装命令,直接运行控制台程序。

    控制台程序将读取 EXE 当前所在文件夹下的ms-playwright文件夹,获取依赖的浏览器。

    但是,这种方式有个明显的缺点——开发和部署的计算机的操作系统必须一致,比如, Windows 开发机上的浏览器文件不能发布到 Linux 上运行。

    这时,可以采用方案 2。

    方案 2. 自动安装

    方案 2 还是需要运行浏览器安装命令,但是从手工运行改成由代码运行:

    1. static async Task Main(string[] args)
    2. {
    3.     Console.WriteLine("Start download chromium");
    4.     var exitCode = Microsoft.Playwright.Program.Main(new[] { "install""chromium" });
    5.     if (exitCode != 0)
    6.     {
    7.        throw new Exception($"Playwright exited with code {exitCode}");
    8.     }
    9.      var playwright = await Playwright.CreateAsync();
    10.      ...
    11. }

    需要注意的是,部署模式一定要选“独立”,否则对应操作系统的安装脚本不会复制到发布文件夹。(我发现 v1.21 存在此 bug,已提交 issue 并修复)

    按照正常流程发布,直接运行控制台程序。

    控制台程序将自动执行浏览器安装命令:

    结论

    2 种简化部署方案,是否能够满足你的需要?欢迎留言反馈!

  • 相关阅读:
    【GIC400】——驱动代码实现
    C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测
    Python基础语法(一)——变量定义和运算符的使用
    Docker 入门 (详细命令讲解)
    正规黄金代理的三大要素
    java springboot 如何实现小程序支付
    损失函数loss和优化器optimizer
    Pytorch 快速参数权重初始化
    Go插件:轻松实现模块化开发与动态功能扩展
    JavaSE - 数组的定义、使用、内存分布、应用
  • 原文地址:https://blog.csdn.net/biyusr/article/details/125575388