电容器3.0升级插件“未实现”异常(NxMonorepo)
我们在 nx monorepo 中使用 Angular,我们已经在其中使用 Capacitor 2.4 半年了。目前我们只使用安卓平台。现在,我们需要升级到 Capacitor 3.0。应用程序本身再次运行,但是,只要我使用任何插件,我总是会收到以下异常:ERROR Error: "Device" plugin is not implemented on android
这对于我尝试使用的每个插件都是一样的。所以,如果我使用存储插件,我只会为“存储”得到相同的例外。我详细地遵循了电容器迁移指南 ( https://capacitorjs.com/docs/v3/updating/3-0 ),但我不知道我哪里出错了。一般来说,只要我将使用电容器插件的任何代码注释掉,该应用程序现在就可以工作。使用插件的代码在升级之前确实有效。
根据迁移指南,我import '@capacitor/core';在 main.ts 文件中添加了,虽然我也尝试将它放在 app.module.ts 中,但也没有成功。我已经按照此处的建议为整个应用程序(根)和 nx-capacitor 应用程序(用@nxtend-capacitor 添加的电容器应用程序)安装了每个插件https://nxtend.dev/docs/capacitor/getting-started/ . 我还更新了 package.json 文件的电容器 cli、电容器核心和电容器 android 版本。此外,根据android升级指南,我还更新了gradle和android gradle插件。我也相应地更新了 Android 变量。
老实说,我对 Capacitor 没有太多经验或深入了解,我知道 Capacitor 3 到目前为止仍处于 Beta 阶段。但是,也许有人已经偶然发现了这个问题并找到了解决方案。我也不确定,这个问题是否可能是通过将这种 monorepo 方法与 nx. 有人在使用 Nx monorepo 时将 Capacitor 升级到 3.0 吗?
作为参考,这是电容器应用程序的当前 package.json:
{
"name": "app-cap",
"dependencies": {
"@capacitor-community/electron": "^1.3.2",
"@capacitor/android": "^3.0.0-rc.0",
"@capacitor/app": "^0.3.6",
"@capacitor/camera": "^0.4.3",
"@capacitor/cli": "^3.0.0-rc.0",
"@capacitor/core": "^3.0.0-rc.0",
"@capacitor/device": "^0.5.6",
"@capacitor/filesystem": "^0.5.2",
"@capacitor/ios": "^3.0.0-rc.0",
"@capacitor/local-notifications": "^0.6.0",
"@capacitor/push-notifications": "^0.3.6",
"@capacitor/storage": "^0.3.6",
"capacitor-secure-storage-plugin": "^0.5.0",
"com-darryncampbell-cordova-plugin-intent": "^2.0.0",
"com.darktalker.cordova.screenshot": "^0.1.6",
"cordova-plugin-advanced-http": "^3.1.0",
"cordova-plugin-app-launcher": "^0.4.0",
"cordova-plugin-appcenter-analytics": "^0.5.1",
"cordova-plugin-appcenter-crashes": "^0.5.1",
"cordova-plugin-appcenter-shared": "^0.5.1",
"cordova-plugin-device": "^2.0.3",
"cordova-plugin-dialogs": "^2.0.2",
"cordova-plugin-file": "^6.0.2",
"cordova-plugin-file-opener2": "^3.0.5",
"cordova-plugin-zip": "^3.1.0",
"jetifier": "^1.6.6"
}
}
回答
两个答案都是错误的。
Capacitor 3 允许 android 插件自动注册,但为此您需要从 MainActivity.java 中删除 init 方法,如果它在那里,自动注册将不起作用,因为 init 是注册插件的传统方式。
所以你有两个选择:
- 从 MainActivity.java 中删除 init 方法,如电容器 3 更新文档中所述
- 保留传统的 init 方法并像在 Capacitor 2 上一样添加插件。IE
add(DatepickPlugin.class);
通过按照答案 1 的建议删除 android 文件夹,init 方法将被删除,这就是该答案有效的原因,但它具有破坏性,它将删除您项目中的所有手动更改。
并且添加插件作为答案 2 建议也有效,但如果使用自动插件注册,则无需这样做,该方法确实适用于非 npm 插件。
回答
尝试删除 android 平台(重要:在删除之前备份您的 android 目录。)
并运行:
npm install @capacitor/core@next @capacitor/cli@next
npx cap init
npm install @capacitor/android@next
npx cap add android
然后构建您的项目并:
npx cap sync