修补 npm 包时出现错误

use*_*561 5 patch yarnpkg-v2

当我修补这样的依赖项时:

\n

package.json

\n
  "dependencies": \n    "react-native-webview": "patch:react-native-webview@11.0.3#scripts/patches/react-native-webview+11.0.3.patch",\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n

patches/react-native-webview+11.0.3.patch

\n
diff --git a/apple/RNCWebView.m b/apple/RNCWebView.m\nindex ff9ff9e0..dfea91a8 100644\n--- a/apple/RNCWebView.m\n+++ b/apple/RNCWebView.m\n@@ -194,12 +194,18 @@ - (void)dealloc\n...\n
Run Code Online (Sandbox Code Playgroud)\n

yarn当我使用或在本地安装东西时,一切正常yarn install。补丁已应用,并且没有错误。

\n

然而,当事情进入 CI 时,我收到如下错误:

\n
**ERROR** Failed to apply patch for package react-native-webview at path\n  \n    node_modules/react-native-webview\n\n  This error was caused because patch-package cannot apply the following patch file:\n\n    patches/react-native-webview+11.0.3.patch\n\n  Try removing node_modules and trying again. If that doesn\'t work, maybe there was\n  an accidental change made to the patch file? Try recreating it by manually\n  editing the appropriate files and running:\n  \n    patch-package react-native-webview\n  \n  If that doesn\'t work, then it\'s a bug in patch-package, so please submit a bug\n  report. Thanks!\n\n    https://github.com/ds300/patch-package/issues\n
Run Code Online (Sandbox Code Playgroud)\n

如果我将补丁更改为使用诸如a/node_modules/react-native-webview/apple/RNCWebView.m. 然后我收到类似的错误

\n
\xe2\x9e\xa4 YN0001: \xe2\x94\x82 Error: react-native-webview@patch:react-native-webview@npm%3A11.0.3#../../scripts/patches/react-native-webview+11.0.3.patch::version=11.0.3&hash=d13297&locator=proj-core%40workspace%3Alib%2Fproj-core: ENOENT: no such file or directory, lstat \'/node_modules/react-native-webview/node_modules/react-native-webview/apple/RNCWebView.m\'\n    at rn (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:172:9625)\n    at kn (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:172:9889)\n    at Qr.resolveFilename (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:177:21594)\n    at Qr.resolveFilename (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:177:21498)\n    at Qr.resolveFilename (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:177:21498)\n    at Qr.lstatSync (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:177:18712)\n    at Qr.lstatPromise (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:177:18671)\n    at yt.lstatPromise (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:177:34701)\n    at Zu (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:578:7908)\n    at YB (/home/user/dev/proj-client/.yarn/releases/yarn-3.0.0.cjs:580:184)\n
Run Code Online (Sandbox Code Playgroud)\n

use*_*561 4

这里的问题是,您使用两种不同的工具来修补 npm 包,并且在本地使用与 CI 中不同的工具:

  • patch-package作为安装后脚本(如果您检查 package.json 中的“postinstall”条目,您会看到类似的内容patch-package --patch-dir ./scripts/patches
  • Yarn 内置的包修补工具,patch:在 package.json 中使用。

然而,它们的工作方式不同:

补丁包 纱线的patch:
从项目根应用补丁,因此您需要包含node_modules/package-name在差异中。 应用软件包安装目录中的补丁,因此您不需要这样做
要求补丁被命名package-name+version.patch 不需要任何特定的命名

这里的解决方案是选择一个,并更改补丁以适用于该系统。因此,例如,如果您重命名文件以删除+version,您将能够仅使用纱线的patch:.