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 是遗留的注册插件的方式。

所以你有两个选择:

  1. 从 MainActivity.java 中删除 init 方法,如 capacitor 3 updating docs
  2. 中所述
  3. 保留旧的初始化方法并像在 Capacitor 2 上那样添加插件。 add(DatepickPlugin.class);

通过按照答案 1 的建议删除 android 文件夹,init 方法被删除,这就是该答案有效的原因,但它具有破坏性,它将删除项目中的所有手动更改。

并且按照答案 2 的建议添加插件也可以,但是如果使用自动插件注册则不需要这样做,该方法确实适用于非 npm 插件。

根据文档,您只需更新 MainActivity.java 文件

https://capacitorjs.com/docs/updating/3-0

就我而言,我只需要更新我的 MainActivity.java

import com.getcapacitor.BridgeActivity;

public class MainActivity extends BridgeActivity {}

使用实时重新加载时,确保 url 中有 http://。

根据documentation

"server": {
  "url": "http://192.168.1.68:8100",
  "cleartext": true
},

当我只使用 ip 时,它呈现了网站,但插件不起作用(未实现异常)。

使用 nxtend 插件我发现我还必须将插件包名称添加到 capacitor.config 中的 "includePlugins": [] 以便同步识别所需的插件并填充下游 gradle android 项目中的文件。据我了解,cap 应该检查项目 package.json 并自动确定使用了哪些插件,但这似乎对我不起作用。