天道酬勤,学无止境

pre-revprop-change 钩子要么失败(pre-revprop-change hook either failed)

问题

我不知道这个钩子是开箱即用的,还是我的只是搞砸了,我只需要替换它,但是当我去尝试编辑提交的日志评论时,我收到以下错误消息:

DAV 请求失败; 可能是存储库的 pre-revprop-change 挂钩失败或不存在
至少一项财产变更失败; 存储库不变
设置属性“日志”时出错

我使用的是 Tortoise v1.6.7,但自从我安装 Tortoise 以来一直有这个问题,只是从来没有研究过它,但它非常烦人。

所以我找到了这篇文章。

但是,由于我无法弄清楚如何使用 Tortoise 进行 svn 命令行调用,我只是进入存储库并打开了 pre-refprop-change 模板,下面是其中的内容。

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

所以仍然试图弄清楚如何改变这一点,以便 Tortoise(即颠覆)允许我编辑评论。 为什么要编辑评论? 因为在我意识到我错过了事后应该在评论中的 x,y,z 之后,有很多次我很高兴并忘记在提交后添加更多评论。 发生在任何人身上。 虽然允许开发人员这样做存在安全风险,但我们每 2 小时备份一次我们的存储库,因此如果有人通过并删除它们,哦,好吧,我愿意承担这个风险,因为我们已经备份了它。 这种风险不应掩盖随意修改评论的能力。

回答1

如果您的存储库在 Windows 机器上,只需创建一个名为 pre-revprop-change.bat 的文件并添加该行

exit 0

在里面。

回答2

只是对 Stefan 为使用 VisualSVN Server 的人提供的优秀答案的一点跟进。

您可以按照以下步骤操作:

1.)启动您的 VisualSVN 服务器管理控制台。

2.)右键单击您选择的存储库并选择“属性”:

在此处输入图片说明

3.)选择“Pre-revision property change hook”并点击Edit按钮:

在此处输入图片说明

4.)输入您的脚本,最小的可能是 Stefan 建议的exit 0

在此处输入图片说明

5.)OK关闭所有对话框,然后就完成了。

下次更改日志消息时,它应该会成功。

回答3

如果您使用的是像 assembla 这样的在线 svn 托管服务,请使用 Uwe Keim 提供的说明来指导您。 您只需要在 svn hosts 网站的某处找到您的 svn 设置。

对于汇编 > 转到您的项目 > svn 选项卡 > 左侧菜单中的设置 > 服务器端挂钩 > 查看“可用的 pre-revprop-change 挂钩”> 单击旁边的安装按钮 > 单击 svn 选项卡返回你的项目。

回答4

仅使用“exit 0”创建一个 bat 文件。 删除所有其他 rem'ed 行。 将其作为“pre-revprop-change.bat”保存到 Path\Repositories\hooks 文件夹并尝试重新运行。

退出 0

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何编辑Subversion中已提交的日志消息?(How to edit log message already committed in Subversion?)
    问题 有没有一种方法可以在Subversion中编辑某个修订版本的日志消息? 我不小心在提交消息中输入了错误的文件名,这以后可能会造成混淆。 我已经看到了如何在Git中编辑错误的提交消息? ,但是Subversion的解决方案似乎并不相似(根据svn help commit )。 回答1 本质上,您必须具有(直接或间接)存储库的管理员权限才能执行此操作。 您可以配置存储库以允许所有用户执行此操作,也可以直接在服务器上修改日志消息。 请参阅Subversion常见问题解答的这一部分(重点是我的): 日志消息作为附加到每个修订版的属性保留在资源库中。 默认情况下,提交日志消息属性(svn:log)后就无法对其进行编辑。 这是因为对修订版属性(其中svn:log是其中之一)的更改导致该属性的先前值被永久丢弃,并且Subversion试图防止您意外地执行此操作。 但是,有两种方法可以让Subversion更改修订版属性。 第一种方法是使存储库管理员启用修订版属性修改。 这是通过创建一个称为“ pre-revprop-change”的钩子来完成的(有关如何执行此操作的更多详细信息,请参见Subversion书中的本节)。 “ pre-revprop-change”挂钩在更改之前可以访问旧日志消息,因此它可以以某种方式(例如,通过发送电子邮件)进行保存。 启用修订版属性修改后,您可以通过将-
  • 什么是SVN中的pre-revprop-change挂钩,如何创建它?(What is a pre-revprop-change hook in SVN, and how do I create it?)
    问题 我想在资源库浏览器中编辑日志注释,并收到一条错误消息,指出该资源库不存在pre-revprop-change挂钩。 除了具有可怕的名称之外,什么是pre-revprop-change钩子,如何创建它? 回答1 基本上,它是在修改存储库中未经版本控制的属性之前启动的脚本,以便您可以更精确地管理存储库中发生的事情。 SVN发行版中的/ hooks子目录中有用于不同挂钩的模板(* .tmpl,您必须根据自己的操作系统进行编辑和重命名才能激活)。 回答2 对于Windows,这是一个示例批处理文件的链接,该文件仅允许更改日志消息(不允许其他属性): http://ayria.livejournal.com/33438.html 基本上,将以下代码复制到文本文件中,并将其命名为pre-revprop-change.bat并将其保存在存储库的\hooks子目录中。 @ECHO OFF :: Set all parameters. Even though most are not used, in case you want to add :: changes that allow, for example, editing of the author or addition of log messages. set repository=%1 set revision=%2 set
  • pre-revprop-change hook either failed
    I don't know if this hook is out-of-box or if mine is just messed up and I just need to replace it but when I go and try to edit a log comment on a commit I get this error message: DAV request failed; it’s possibly that the repository’s pre-revprop-change hook either failed or is non-existent At least one property change failed; repository is unchanged Error setting property ‘log’ I'm using Tortoise v1.6.7 but have had this problem all along since I installed Tortoise, just never looked into it but it's extremely annoying. So I found this article. However since I can't figure out how to do svn
  • 如何备份远程SVN存储库(How do I back up a remote SVN repository)
    问题 我目前正在将SVN服务器从家庭服务器移至远程服务器,以便可以从其他位置更轻松地访问它。 我的远程服务器没有备份,因此我想定期将其备份到我的家庭服务器。 远程服务器是Windows 2003服务器。 家用服务器是Windows家用服务器。 做这个的最好方式是什么? 我可以每天晚上让我的家庭服务器获取远程服务器的转储吗? 带宽不是一个很大的考虑因素,但是如果我可以将任何新签入复制到我的家庭服务器上的SVN服务器上,那将是很好的。 任何建议欢迎。 回答1 只需使用svnsync命令。 首先,在您的家用计算机上创建一个新的存储库。 svnadmin create c:\backuprepo 或在Unix上: svnadmin create ./backuprepo 接下来,创建一个名为pre-revprop-change.bat的文件: echo exit 0 > c:\backuprepo\hooks\pre-revprop-change.bat 或在Unix上: echo -ne '#!/bin/sh\nexit 0' > ./backuprepo/hooks/pre-revprop-change chmod ugo+x ./backuprepo/hooks/pre-revprop-change 然后,初始化同步: svnsync init file:///c
  • What is a pre-revprop-change hook in SVN, and how do I create it?
    I wanted to edit a log comment in the repository browser and received an error message that no pre-revprop-change hook exists for the repository. Besides having a scary name, what is a pre-revprop-change hook, and how do I create it?
  • 追溯更改SVN提交消息?(Change SVN commit message retroactively?)
    问题 我想将大量SVN提交消息重写为不同的结构,例如为类别添加前缀。 从: "foo" now accepts "bar" format for connection string. 我想 core - database - "foo" now accepts "bar" format for connection string. 有没有简单的方法可以做到这一点,而不包括使用svndumpfilter转储整个存储库? 我在客户端使用TortoiseSVN,在服务器端使用VisualSVN。 (VisualSVN是经典svn的包装,我也可以通过命令行与之交谈。) 回答1 是的,提交消息可以更改。 它们被实现为修订版的属性,类似于常规的文件属性。 在TortoiseSVN日志窗口中,您可以右键单击提交,然后选择“编辑日志消息”。 回答2 当然,您可以追溯地更改日志消息,在FAQ中对此进行了介绍。 我不确定VisualSVN的命令行界面如何工作,但是对于vanilla svn来说,命令是 svn propset -r N --revprop svn:log "new log message" URL 如果要对所有修订版本执行此操作,而无需转储存储库并重新加载,则可以编写此命令的脚本以处理所有修订版本的列表。 根据存储库的大小,这种方式将花费一些时间,但是原则上没有理由不这样做
  • 在TortoiseSVN中更改作者姓名(Change author name in TortoiseSVN)
    问题 HI拥有3台WinXP计算机,它们可以基于Linux服务器访问Subversion。 我想更改几台计算机的日志中显示的作者姓名,因为它们是“ development pc 3”和旧雇员的姓名。 我该怎么做呢? 回答1 要求TSVN按照更改日志的顺序“显示日志”,按作者的所有提交,然后选择感兴趣的作者的所有提交,并使用“编辑作者”。 回答2 您很可能尝试过像Sharptooth建议的那样更改作者姓名,但是随后您可能会收到一条错误消息,指出您不能这样做。 这需要隐式使用pre-revprop-change钩子。 默认情况下,此钩子将始终返回错误,除非您实际覆盖模板并制作能够返回零值的实际脚本。 从svn-book: 如果在常规提交的范围之外执行,则pre-revprop-change挂钩将在修改修订版属性之前立即运行。 与其他挂钩不同,此挂钩的默认状态是拒绝建议的操作。 在进行修订版属性修改之前,该挂钩实际上必须存在并且返回零退出值。 这是我pre-revprop-change钩子的副本,它使我可以编辑日志消息,但不能编辑作者: REPOS="$1" REV="$2" USER="$3" PROPNAME="$4" ACTION="$5" if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi # if
  • 如何导出(然后导入)Subversion存储库?(How do I export (and then import) a Subversion repository?)
    问题 我即将结束一个使用商业SVN提供程序存储源代码的项目。 客户最终选择的虚拟主机包括一个存储库,作为托管软件包的一部分,因此,既然项目结束了,我想将存储库重新放置到他们的虚拟主机上,并停止使用商业帐户。 我将如何去做呢? 回答1 如果要移动存储库并保留历史记录,则可能需要在两个主机上都具有文件系统访问权限。 如果您的后端是FSFS(最新版本的默认设置),则最简单的解决方案是制作整个存储库文件夹的文件系统副本。 如果您拥有Berkley DB后端,或者不确定后端是什么,或者您要更改SVN版本号,则将要使用svnadmin来转储旧存储库并将其加载到新存储库中资料库。 使用svnadmin dump将为您提供单个文件备份,您可以将其复制到新系统。 然后,您可以创建新的(空)存储库并使用svnadmin load ,它实际上将重播所有提交及其元数据(作者,时间戳等)。 您可以在此处阅读有关转储/加载过程的更多信息: http://svnbook.red-bean.com/en/1.8/svn.reposadmin.maint.html#svn.reposadmin.maint.migrate 另外,如果您执行svnadmin load ,请确保使用--force-uuid选项,否则其他人在切换到新存储库时会遇到问题。 Subversion使用UUID在内部标识存储库
  • openwrt svn rsync
    一、svn配置 1、make menuconfig Network --> Version Control Systems --><*> subversion-server ...... subversion server 2、创建仓库 mkdir -vp /mnt/usb_file_svn/ svnadmin create --fs-type fsfs /mnt/usb_file_svn/ uci set subversion.@[0].path=/mnt/usb_file_svn/ uci commit 3、修改conf/svnserve.conf文件 vim /mnt/usb_file_svn/conf/svnserve.conf 取消下面的注释 anon-access = read auth-access = write password-db = passwd authz-db = authz realm = My First Repository 4、修改conf/passwd文件 vim /mnt/usb_file_svn/conf/passwd [users] # harry = harryssecret # sally = sallyssecret hw = 123456 gw = 123456 5、修改conf/authz文件 vim /mnt/usb_file
  • 如何解决SVN导入行结尾错误?(How can I fix the SVN import line endings error?)
    问题 我必须导入一个庞大的SVN存储库,该存储库必须从一台服务器转移到另一台服务器。 所以我从旧服务器导出了它: svnadmin dump . > archive.svn 并将其导入到新版本中: svnadmin load . < archive.svn 在导入过程中,我遇到了以下错误: Cannot accept non-LF line endings in 'svn:ignore' property 我怎样才能解决这个问题? 我对两台服务器都拥有完全控制权。 回答1 您是否更改了服务器版本? 这是1.6中的一个已知问题,从1.4或1.5开始会导致问题。 Subversion 1.6不再接受属性文件中的回车符(^ M)。 您需要在svn:ignore文件中修复换行符,或者如果更简单则重新创建。 另外,您可以选择Subversion 1.7,或使用uberSVN。 回答2 您有2个选择,修复源或禁用prop验证。 修复源(svn:log和svn:ignore) : sed -e '/^svn:log$/,/^K / s/^M/ /' -e '/^svn:ignore$/,/^PROPS-END$/ s/^M/\n/' archive.svn > repaired-archive.svn svnadmin load . < repaired-archive.svn 其中^
  • SVN提交具有旧的日期/时间(SVN commit with old date/time)
    问题 有什么方法可以使用旧时间/日期提交到SVN存储库,或者如何编辑提交后的时间/日期? 在我开始使用SVN之前,我有一些非常古老的存档源,现在我想将它们放入SVN中,并尽可能保留其原始日期,以便SVN历史记录与编辑文件的实际日期匹配。 。 操纵SVN服务器时间是一个显而易见的选择,但是在这里不能使用它,因为SVN服务器不受我的控制。 回答1 日期和时间在“特殊”修订版属性svn:date中。 您可以这样修改它: svn propedit svn:date --revprop -r 12345 或者: svn propset svn:date --revprop -r 12345 2009-02-12T00:44:04.921324Z 修订版本(例如上面的12345 )也可以是HEAD表示最新的修订版本。 日期以ISO 8601格式指定。 您将需要在存储库中设置适当的pre-revprop-change挂钩(在存储库的hook目录中),以允许svn:date进行修改。 SVN存储库随附的模板应该会有所帮助。 回答2 每个修订版都有一个属性svn:date 。 如果您有权修改未版本控制的属性,则可以更改该值。 回答3 我最终所做的是: 在我的工作站上安装VisualSVN服务器创建一个新的“本地” SVN存储库逐个存档,每个存档: 在工作副本中,删除除.svn文件之外的所有内容
  • 【linux】循序渐进学运维-服务篇-svn服务器单机实战
    文章目录1. 启动服务测试2. 配置用户和密码及认证权限1)修改密码文件2)设置用户和组的权限1. 实验环境2. 使用yum安装svn3. 创建版本库目录svn简介运行原理svn 单机形式安装4. 查看版块库的目录结构:修改配置文件1. 修改配置文件:启动svn并测试总结svn简介SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于CVS,它采用了分支管理系统,它的设计目标就是取代CVS。官方网站:http://subversion.apache.org/ Windows客户端 :http://tortoisesvn.net/常见的版本控制软件:svngitSVN存储数据的方式BDB,Berkeley DB,一种事务安全型表类型FSFS,“FSFS” 采用文件系统的方式, 替代原来的基于Berkeley DB的实现。 因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。端口号:3690运行原理svn 可以单独运行,也可以跟apache结合起来使用,SVN结合apache的时候需要用到模块 mod_dav_svn客户端访问svn,需要先经过80端口访问apache,使用mod_dav_svn的协议实现网站的展现,进而访问到SVN serversvn 单机形式安装1. 实验环境查看系统环境:[root@zmedu-17 ~]# uname
  • 有没有办法在整个存储库历史记录中更改SVN用户的用户名?(Is there a way to change a SVN users username through the entire repository history?)
    问题 当我的团队刚开始使用SVN时,我们在提交存储库时都只使用了我们的名字,但是,由于我们的团队已经成长,我们遇到了问题,因为我们只雇用了第二个Mike 。 我们要做的是将每个人的用户名更改为与他们计算机上的用户名相同(名字的首字母+姓氏)。 我看到的问题是SVN历史记录仍会在提交时显示旧的用户名。 是否有工具可以在整个存储库的整个历史记录中更改用户名? 例如,我希望当前归因于Mike的每个提交都更改为msmith,一直到版本1。 我首先想到的是,我必须对转储文件进行一些解析和处理,但是使用工具会很好。 回答1 您可以使用svndumptool: svnadmin转储路径/到/我/回购> repo.dump svndumptool transform-revprop svn:author originalregexp newvalue repo.dump newrepo.dump 回答2 TortoiseSVN对此功能提供了出色的支持:在其“修订日志”对话框中,可以按作者(甚至通过正则表达式)进行过滤,根据需要从过滤列表中选择修订(通常都是与本问题类似),然后从上下文中选择“编辑作者”菜单。 当然,如jeroenhs的回答中所述,在预备更换前安装挂钩的前提条件仍然适用。 该处理是相当缓慢的,但根据需要的人这可能仍然是更快和/或更方便的然后有倾倒整个仓库
  • 如何在VisualSVN服务器中要求提交消息?(How to require commit messages in VisualSVN server?)
    问题 我们已经在Windows上将VisualSVN Server设置为我们的Subversion服务器,并且在工作站上使用Ankhsvn + TortoiseSVN作为客户端。 如何配置服务器以要求提交消息为非空? 回答1 VisualSVN Server 3.9提供了VisualSVNServerHooks.exe check-logmessage预提交钩子,该钩子可帮助您拒绝带有空或简短日志消息的提交。 有关说明,请参见文章KB140:在VisualSVN Server中验证提交日志消息。 除了内置的VisualSVNServerHooks.exe ,VisualSVN Server和SVN通常还使用许多挂钩来完成这样的任务。 start-commit-在提交事务开始之前运行,可用于进行特殊权限检查预提交-在事务结束时但在提交之前运行。 通常用于验证诸如非零长度日志消息之类的内容。 提交后-在提交事务后运行。 可用于发送电子邮件或备份存储库。 pre-revprop-change —在修订属性更改之前运行。 可用于检查权限。 post-revprop-change —在修订版属性更改后运行。 可用于通过电子邮件发送或备份这些更改。 您需要使用pre-commit钩子。 您可以使用平台支持的几乎任何语言自己编写代码,但是网络上有许多脚本。 谷歌搜索“ svn precommit
  • SVN显示用户名而不是用户ID(SVN show usernames instead of user ids)
    问题 因此,我们有了这个SVN存储库,在该存储库中,更清晰地显示了较早的提交者名称,并且更容易跟踪谁做了什么。 最近,svn信息库已移至另一台服务器并进行了设置,因此现在当我们检查日志时,我们只能看到作者的用户ID。 我相信我们可以更新服务器中的SVN authz或其他设置文件来添加作者姓名。 我想问的是,在客户端有什么方法可以做到这一点? 主要是因为我们没有修改SVN服务器设置的权限。 有没有办法我可以拥有一个道具或可以在其中进行映射的东西,它可以显示在日志中。 我正在使用tortoiseSVN作为SVN客户端。 回答1 这些Subversion用户ID来自何处? 您的Subversion是否像Windows Active Directory一样与LDAP集成在一起,还是这是一个单独的Subversion授权文件? 用户ID是否从旧服务器(人们用来使用其名称的旧服务器)更改为当前用户ID? 我可以想到两件事: 您通过LDAP使用Windows AD,旧服务器针对用户的cn属性进行验证,而新服务器针对sAMAccountName验证。 您的旧服务器有一个提交后钩子,该钩子将svn:author修订版属性从用户的登录ID更改为用户的名称。 您还有旧的Subversion服务器吗? 您应该查看是否可以找到设置上的差异。 附加评论 谢谢大卫。 由于访问限制,尽管不确定我是否能够进行检查
  • sharpsvn logmessage编辑sharpsvn?(sharpsvn logmessage edit sharpsvn?)
    问题 使用Sharpsvn。 特定版本的日志消息要更改。 它的实现类似于svn的“ [显示日志]-[编辑日志消息]”。 我英语很尴尬。 因此,以帮助您了解。 我的代码已附上。 public void logEdit() { Collection<SvnLogEventArgs> logitems = new Collection<SvnLogEventArgs>(); SvnRevisionRange range = new SvnRevisionRange(277, 277); SvnLogArgs arg = new SvnLogArgs( range ) ; m_svn.GetLog(new System.Uri(m_targetPath), arg, out logitems); SvnLogEventArgs logs; foreach (var logentry in logitems) { string autor = logentry.LogMessage; // only read .. // autor += "AA"; } // m_svn.Log( new System.Uri(m_targetPath), new System.EventHandler<SvnLogEventArgs> ()); } 回答1
  • 如何在Subversion上保留原始文件的[commit]时间戳?(How can I keep the original file [commit] timestamp on Subversion?)
    问题 我想确定的是,如果我在一台计算机上在Subversion中提交某些内容,而在另一台计算机上签出,则我将获得相同的日期时间和时间戳值。 目前,我观察到文件修改的日期时间是从进行同步的那一刻开始的,而不是从原始值开始的。 对我来说,知道文件何时同步没有任何意义-我只想查看最后的提交时间。 此问题与时区无关。 回答1 您可以在.subversion/config : [miscellany] use-commit-times = yes 尽管如果我们谈论源文件,则会产生奇怪的副作用。 例如,您构建软件并执行svn update 。 现在,更新文件的时间戳早于构建结果文件的时间戳,即使某些源文件已更改,也不会重建。 使用此设置时要格外小心。 回答2 如果您使用的是TortoiseSVN,则有一个选项。 TortoiseSVN->设置->常规->“将文件日期设置为'最后提交时间'”。 回答3 Subversion不会保留文件的原始时间戳。 如果您绝对需要保留时间戳,则必须自己做。 例如,您可以将原始时间戳存储为Subversion属性。 回答4 看来'stat -c%y $ FILE'用作在svn:date上运行的pre-revprop-change挂钩的一部分。 我可能会看到的唯一问题是日期格式。
  • Git 预提交钩子在 GitHub for mac 中失败(在命令行上工作)(Git pre-commit hook failing in GitHub for mac (works on command line))
    问题 我创建了一个非常简单的预提交脚本:- #!/usr/bin/env sh # Run tests npm test if [ $? -ne 0 ]; then echo "Tests failed. Aborting.." exit 1 fi exit 0 当我在命令行运行git commit时(测试失败),我得到预期的退出 1,并显示消息Tests failed. Aborting.. Tests failed. Aborting.. 但是,如果我使用 GitHub for Mac 但是我得到: .git/hooks/pre-commit: line 5: npm: command not found Tests failed. Aborting.. (256) 我猜这归结为npm无法用于 GitHub for Mac 正在使用的执行环境,但我一直在努力研究如何解决这个问题。 回答1 解决。 由于全局安装的节点模块最终位于/usr/local/bin我只需要在预提交的开头添加以下内容: PATH=$PATH:/usr/local/bin:/usr/local/sbin 即在执行时将/usr/local/bin和/usr/local/sbin附加到PATH中。 回答2 在 Github Desktop 和 Sourcetree 等 GUI 环境中可用的 $PATH
  • Webpack 基石 tapable 揭秘
    Webpack 基于 tapable 构建了其复杂庞大的流程管理系统,基于 tapable 的架构不仅解耦了流程节点和流程的具体实现,还保证了 Webpack 强大的扩展能力;学习掌握tapable,有助于我们深入理解 Webpack。 一、tapable是什么? The tapable package expose many Hook classes,which can be used to create hooks for plugins. tapable 提供了一些用于创建插件的钩子类。 个人觉得 tapable 是一个基于事件的流程管理工具。 二、tapable架构原理和执行过程 tapable于2020.9.18发布了v2.0版本。此文章内容也是基于v2.0版本。 2.1 代码架构 tapable有两个基类:Hook和HookCodeFactory。Hook类定义了Hook interface(Hook接口), HookCodeFactoruy类的作用是动态生成一个流程控制函数。生成函数的方式是通过我们熟悉的New Function(arg,functionBody)。 2.2 执行流程 tapable会动态生成一个可执行函数来控制钩子函数的执行。我们以SyncHook的使用来举一个例子,比如我们有这样的一段代码: // SyncHook使用 import {
  • Webpack 基石 tapable 揭秘
    Webpack 基于 tapable 构建了其复杂庞大的流程管理系统,基于 tapable 的架构不仅解耦了流程节点和流程的具体实现,还保证了 Webpack 强大的扩展能力;学习掌握tapable,有助于我们深入理解 Webpack。 一、tapable是什么? The tapable package expose many Hook classes,which can be used to create hooks for plugins. tapable 提供了一些用于创建插件的钩子类。 个人觉得 tapable 是一个基于事件的流程管理工具。 二、tapable架构原理和执行过程 tapable于2020.9.18发布了v2.0版本。此文章内容也是基于v2.0版本。 2.1 代码架构 tapable有两个基类:Hook和HookCodeFactory。Hook类定义了Hook interface(Hook接口), HookCodeFactoruy类的作用是动态生成一个流程控制函数。生成函数的方式是通过我们熟悉的New Function(arg,functionBody)。 2.2 执行流程 tapable会动态生成一个可执行函数来控制钩子函数的执行。我们以SyncHook的使用来举一个例子,比如我们有这样的一段代码: // SyncHook使用 import {