Capacitor 3.0 升级插件 "not implemented" 异常(Nx Monorepo)
Capacitor 3.0 Upgrade Plugins "not implemented" Exception (Nx Monorepo)
我们在 nx monorepo 中使用 Angular,其中我们已经使用 Capacitor 2.4 半年了。我们目前只使用 android 平台。现在,我们需要升级到 Capacitor 3.0。该应用程序本身又是 运行,但是,只要我使用任何插件,我总是会遇到以下异常:ERROR Error: "Device" plugin is not implemented on android
这对于我尝试使用的每个插件都是一样的。因此,如果我使用 Storage Plugin,我只会为“Storage”获得相同的异常。我已经详细遵循了 Capacitor migration guide (https://capacitorjs.com/docs/v3/updating/3-0),但我不知道哪里出错了。总的来说,只要我将任何使用电容器插件的代码注释掉,该应用程序现在就可以运行。使用插件的代码在升级前确实有效。
根据迁移指南,我在 main.ts 文件中添加了 import '@capacitor/core';
,尽管我也尝试将其放入 app.module.ts 但也没有成功。我已经按照此处 https://nxtend.dev/docs/capacitor/getting-started/ 的建议为整个应用程序(根目录)和 nx-capacitor 应用程序(添加了 @nxtend-capacitor 的电容器应用程序)安装了每个插件。我还为两个 package.json 文件更新了电容器 cli、电容器核心和电容器 android 版本。
此外,根据 android 升级指南,我还更新了 gradle 和 android gradle 插件。我还相应地更新了 Android 变量。
老实说,我对 Capacitor 没有太多经验或深入了解,我知道 Capacitor 3 目前仍处于 Beta 阶段。但是,也许有人已经偶然发现了这个问题并找到了解决方案。我也不确定,这个问题是否可能是由于在 nx 中使用这种 monorepo 方法引起的。有人有使用 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"
}
}
尝试删除 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
我遇到了同样的问题
您需要在 MainActivity.java
中手动添加插件
public class MainActivity extends BridgeActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// --- Remove bridge init as it's deprecated and add these lines
registerPlugin(com.capacitorjs.plugins.app.AppPlugin.class);
registerPlugin(com.capacitorjs.plugins.device.DevicePlugin.class);
// ---
}
}
两个答案都是错误的。
Capacitor 3 允许 android 插件自动注册,但为此你需要从 MainActivity.java 中删除 init 方法,如果它在那里自动注册将无法工作,因为 init 是遗留的注册插件的方式。
所以你有两个选择:
- 从 MainActivity.java 中删除 init 方法,如 capacitor 3 updating docs
中所述
- 保留旧的初始化方法并像在 Capacitor 2 上那样添加插件。
add(DatepickPlugin.class);
通过按照答案 1 的建议删除 android 文件夹,init 方法被删除,这就是该答案有效的原因,但它具有破坏性,它将删除项目中的所有手动更改。
并且按照答案 2 的建议添加插件也可以,但是如果使用自动插件注册则不需要这样做,该方法确实适用于非 npm 插件。
根据文档,您只需更新 MainActivity.java 文件
就我而言,我只需要更新我的 MainActivity.java
import com.getcapacitor.BridgeActivity;
public class MainActivity extends BridgeActivity {}
使用实时重新加载时,确保 url 中有 http://。
"server": {
"url": "http://192.168.1.68:8100",
"cleartext": true
},
当我只使用 ip 时,它呈现了网站,但插件不起作用(未实现异常)。
使用 nxtend 插件我发现我还必须将插件包名称添加到 capacitor.config 中的 "includePlugins": []
以便同步识别所需的插件并填充下游 gradle android 项目中的文件。据我了解,cap 应该检查项目 package.json 并自动确定使用了哪些插件,但这似乎对我不起作用。
我们在 nx monorepo 中使用 Angular,其中我们已经使用 Capacitor 2.4 半年了。我们目前只使用 android 平台。现在,我们需要升级到 Capacitor 3.0。该应用程序本身又是 运行,但是,只要我使用任何插件,我总是会遇到以下异常:ERROR Error: "Device" plugin is not implemented on android
这对于我尝试使用的每个插件都是一样的。因此,如果我使用 Storage Plugin,我只会为“Storage”获得相同的异常。我已经详细遵循了 Capacitor migration guide (https://capacitorjs.com/docs/v3/updating/3-0),但我不知道哪里出错了。总的来说,只要我将任何使用电容器插件的代码注释掉,该应用程序现在就可以运行。使用插件的代码在升级前确实有效。
根据迁移指南,我在 main.ts 文件中添加了 import '@capacitor/core';
,尽管我也尝试将其放入 app.module.ts 但也没有成功。我已经按照此处 https://nxtend.dev/docs/capacitor/getting-started/ 的建议为整个应用程序(根目录)和 nx-capacitor 应用程序(添加了 @nxtend-capacitor 的电容器应用程序)安装了每个插件。我还为两个 package.json 文件更新了电容器 cli、电容器核心和电容器 android 版本。
此外,根据 android 升级指南,我还更新了 gradle 和 android gradle 插件。我还相应地更新了 Android 变量。
老实说,我对 Capacitor 没有太多经验或深入了解,我知道 Capacitor 3 目前仍处于 Beta 阶段。但是,也许有人已经偶然发现了这个问题并找到了解决方案。我也不确定,这个问题是否可能是由于在 nx 中使用这种 monorepo 方法引起的。有人有使用 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"
}
}
尝试删除 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
我遇到了同样的问题
您需要在 MainActivity.java
中手动添加插件public class MainActivity extends BridgeActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// --- Remove bridge init as it's deprecated and add these lines
registerPlugin(com.capacitorjs.plugins.app.AppPlugin.class);
registerPlugin(com.capacitorjs.plugins.device.DevicePlugin.class);
// ---
}
}
两个答案都是错误的。
Capacitor 3 允许 android 插件自动注册,但为此你需要从 MainActivity.java 中删除 init 方法,如果它在那里自动注册将无法工作,因为 init 是遗留的注册插件的方式。
所以你有两个选择:
- 从 MainActivity.java 中删除 init 方法,如 capacitor 3 updating docs 中所述
- 保留旧的初始化方法并像在 Capacitor 2 上那样添加插件。
add(DatepickPlugin.class);
通过按照答案 1 的建议删除 android 文件夹,init 方法被删除,这就是该答案有效的原因,但它具有破坏性,它将删除项目中的所有手动更改。
并且按照答案 2 的建议添加插件也可以,但是如果使用自动插件注册则不需要这样做,该方法确实适用于非 npm 插件。
根据文档,您只需更新 MainActivity.java 文件
就我而言,我只需要更新我的 MainActivity.java
import com.getcapacitor.BridgeActivity;
public class MainActivity extends BridgeActivity {}
使用实时重新加载时,确保 url 中有 http://。
"server": {
"url": "http://192.168.1.68:8100",
"cleartext": true
},
当我只使用 ip 时,它呈现了网站,但插件不起作用(未实现异常)。
使用 nxtend 插件我发现我还必须将插件包名称添加到 capacitor.config 中的 "includePlugins": []
以便同步识别所需的插件并填充下游 gradle android 项目中的文件。据我了解,cap 应该检查项目 package.json 并自动确定使用了哪些插件,但这似乎对我不起作用。