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

前言

上次的文章Hello Playwright:(1)从开发到部署发表后,有网友留言问,有不有简化部署的方式:

cdf22e3312092541f48b29add06ca134.png

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

方案 1. Copy

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

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

具体做法如下:

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

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

<Target Name="PublishPlaywright" AfterTargets="Publish"><ItemGroup><PlaywrightFiles Include="$(LOCALAPPDATA)\ms-playwright\**\*.*" /></ItemGroup><CopySourceFiles="@(PlaywrightFiles)"DestinationFiles="$(PublishDir)\ms-playwright\%(RecursiveDir)%(Filename)%(Extension)"/>
</Target>
  • 按照正常流程发布

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

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

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

这时,可以采用方案 2。

方案 2. 自动安装

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

static async Task Main(string[] args)
{Console.WriteLine("Start download chromium");var exitCode = Microsoft.Playwright.Program.Main(new[] { "install", "chromium" });if (exitCode != 0){throw new Exception($"Playwright exited with code {exitCode}");}var playwright = await Playwright.CreateAsync();...
}

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

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

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

5170d17916143150c6e26229e0b9e469.gif

结论

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

添加微信号【MyIO666】,邀你加入技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门指南及实战 第一步 概述及经典HelloWorld

本系列文章环境及学习门槛 编程基础&#xff1a;无年龄&#xff1a;具有一定的逻辑思维英文&#xff1a;不要求数学&#xff1a;不要求学习时长&#xff1a;每天一篇&#xff0c;一周4-5篇即可&#xff0c;每篇最多1小时死记硬背&#xff1a;不需要&#xff0c;理解至上本机环…

为什么云服务器没西南的_去年“双11“我买的那台云服务器

一、为什么会买云服务器为什么初学者需要一台云服务器&#xff1f;从我自己那仅有的一点经验来看&#xff0c;重点无非这一个词&#xff1a;实践。细数一下初学者拥有一台云服务器的好处&#xff1a;学习操作系统、熟悉环境大部分初学者在本地使用的是windows系统&#xff0c;在…

Java线程安全以及线程安全的实现方式和内存模型(JMM)

一、了解几个概念 1&#xff09;临界区&#xff1a; 临界区指的是一个访问共用资源&#xff08;例如&#xff1a;共用设备或是共用存储器&#xff09;的程序片段&#xff0c;而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时&#xff0c;其他线程或是进…

animate 实现滑动切换效果

今天和大家分享一下用 animate 实现滑动切换效果的小例子 ------- 来自<一只有梦想的前端小白> 大家都知道jQuery 提供的有一下几种方法能够实现滑动效果&#xff1a; slideDown()slideUp()slideToggle()但是以上的滑动不太方便控制其滑动的方向&#xff0c;所以我们还是…

C++入门指南及实战 第二步 HelloWorld及扩展详解

回顾 在上一节中&#xff0c;我们编写了如下代码&#xff0c;完成了 HelloWorld程序的编写&#xff1a; #include<iostream> using namespace std;int main(){cout <<"Hello World";return 0; }本小节将会对该代码进行讲解&#xff0c;并且解释一下专业…

2560x1600分辨率高吗_做设计还弄不清分辨率和像素之间的关系,来了解下他们是怎么换算...

许多同学都在问我关于像素的问题&#xff0c;为什么印刷时要300分辨率以上&#xff1f;网页为什么72就够了&#xff1f;做户外喷绘30&#xff0c;甚至巨幅画面20就上了。关于这些还是很多人不知道的&#xff0c;要不也不会被卖手机的忽悠&#xff0c;各大手机推销员拿着手机大声…

使用 fixture 机制重构 appium_helloworld

一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…

Tomcat相关 -- 内存设置

java内存溢出详解 一、常见的java内存溢出 1、java.lang.OutOfMemmoryError : Java heap space -- JVM Heap &#xff08;jvm 堆溢出&#xff09; JVM启动时自动设置JVM Heap的值&#xff0c;其初始空间(即 -Xms)是物理内存的1/64&#xff0c;最大空间(-Xms)不可超过物理内存。…

CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF

CoreWCF 项目组正式发布 1.0 版本的 CoreWCF, 这是面向 .NET Core 平台的 WCF 移植版本。它支持 SOAP、NetTCP 和 WSDL 的相同实现。在代码中的使用方式于 WCF 相同&#xff0c;但是升级到使用 ASP.NET Core 作为服务宿主&#xff0c;并工作在 .NET Core 平台上。这是该项目的第…

表头合并_多个Excel表格合并数据麻烦?试试Power Query轻松帮你解决

Hi!大家好&#xff01;欢迎来到小龙自修室&#xff01;又到了小龙分享时间&#xff01;(今天的内容有点多&#xff0c;希望各位看官一定要看到最后&#xff01;有惊喜)上一篇文字小龙和大家一起制作了一个限定数据内容录入的电子表格&#xff0c;我的表格我做主&#xff01;表格…

C++入门指南及实战 第三步 基本变量

在C编程中&#xff0c;内置了一些基本数据类型用来存储一些不同类型的值。有字符类型 char 用以存储字符&#xff0c;如a、b、c、d、-、、1、2、4、3、>、?等&#xff1b;有整形 int 用以存储整数类型&#xff0c;如1、2、3、4、5、11、111、2311等&#xff1b;有浮点类型 …

OPCServer Modbus使用和配置

一&#xff0c;安装KEPware.Enhanced.OPC.DDE.KEPServer。(PLC数据传送给KEPServer,开发的程序用OPCServer读KEPServer) 设置ip地址后面是指的plc站号&#xff0c;此处必须和plc上站号对应。否则无法接收数据。 打开quick client 查看传值情况 二.C#程序代码 引用opcdaauto.dll…

C# 创建命名管道服务器

通过创建 NamedPipeServerStream 的一个新实例&#xff0c;来创建服务器。NamedPipeServerStream 派生自基类 PipeStream&#xff0c;PipeStream 派生自 Stream 基类&#xff0c;因此可以使用流的所有功能&#xff0c;例如&#xff0c;可以创建CryptoStream 或 GZipStream&…

在香蕉派 Banana Pi BPI-M1上使用 开源 OxOffice Impress

2019独角兽企业重金招聘Python工程师标准>>> 在香蕉派 Banana Pi BPI-M1上使用 开源 OxOffice Impress 在Banana Pi BPI-M1上使用OxOffice Impress&#xff0c;該簡報大小約26MB&#xff0c;採用自動播放機制。 OxOffice提供 arm linux的版本&#xff0c;可佈署在ar…

免杀新姿势:利用线程将恶意代码注入到内存中

本文讲的是免杀新姿势&#xff1a;利用线程将恶意代码注入到内存中&#xff0c;产生存放远程攻击线程的进程在这篇文章中我不想一步一步解释我编写的C#代码&#xff0c;但是我会展示下它能够绕过杀毒软件&#xff0c;并且操作非常简单&#xff0c;而且实用。 首先说明一下&…

Java之解决散列表的冲突用开放定址法和链表法

1 问题 理想状态下&#xff0c;散列表就是一个包含关键字的固定大小的数组&#xff0c;通过使用散列函数&#xff0c;将关键字映射到数组的不同位置&#xff0c;哈希函数可以将关键字均匀的分散到数组的不同位置&#xff0c;不会出现两个关键字散列值相同&#xff08;假设关键…

python 手把手教你基于搜索引擎实现文章查重

前言 文章抄袭在互联网中普遍存在&#xff0c;很多博主都收受其烦。近几年随着互联网的发展&#xff0c;抄袭等不道德行为在互联网上愈演愈烈&#xff0c;甚至复制、黏贴后发布标原创屡见不鲜&#xff0c;部分抄袭后的文章甚至标记了一些联系方式从而使读者获取源码等资料。这…

lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法

什么是LRU算法&#xff1f;redis大家都玩过吧&#xff0c;你们好奇redis内存数据存满之后会发生什么吗&#xff1f;抛出异常&#xff1f;禁止使用&#xff1f;还是删除数据&#xff1f;其实redis设计了一种内润淘汰机制。noeviction(默认策略)&#xff1a;屏蔽写操作&#xff0…

bzoj3224 Tyvj 1728 普通平衡树题解--Treap

题面&#xff1a; Description您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a; 1. 插入x数 2. 删除x数(若有多个相同的数&#xff0c;因只删除一个) 3. 查询x数的排名(若有多个相同的数&…

Blazor University (18)使用 RenderFragments 模板化组件 —— 创建 TabControl

原文链接&#xff1a;https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/创建一个 TabControl 组件源代码[1]接下来我们将创建一个 TabControl 组件。这将教您如何实现以下目标&#xff1a;将数据传递到 RenderFragment 以为其…