跳至主要内容

.flutter-plugins-dependencies 替换 .flutter-plugins。

摘要

#

flutter 工具将不再输出旧版 .flutter-plugins 元数据文件,而只输出 .flutter-plugins-dependencies。依赖于 .flutter-plugins 存在的工具和构建脚本(例如 Android 应用的 Gradle 配置)需要更新。

背景

#

在 2019 年 .flutter-plugins-dependencies 作为一种更新的文件格式添加,用于替换 .flutter-plugins

因此,一个看起来像这样的文件

txt
# This is .flutter-plugins
camera=/path/to/camera/plugin
shared_preferences=shared_preferences

…被替换成类似这样的文件

json

{
  "dependencyGraph": {
    "camera": {
      "name": "camera",
      "version": "0.10.0",
      "dependencies": {
        "flutter": "0.0.0"
      }
    },
    "shared_preferences": {
      "name": "shared_preferences",
      "version": "2.0.15",
      "dependencies": {
        "flutter": "0.0.0"
      }
    }
  },
  "flutter": {
    "frameworkRevision": "3a0f99d4f2",
    "channel": "stable"
  }
}

同时输出这两个文件会导致技术债务,从而使新的功能集变得复杂,例如不在发布应用中捆绑dev_dependency插件。

迁移指南

#

大多数Flutter开发者不会解析或使用此文件,但构建配置(例如settings.gradle)会根据旧版本的flutter create --platforms android生成。这些旧文件可能仍然引用.flutter-plugins,必须更新为较新的构建脚本。

例如

groovy
include ':app'

def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()

def plugins = new Properties()
// Note explicitly reading the legacy '.flutter-plugins' file.
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}

plugins.each { name, path ->
    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
    include ":$name"
    project(":$name").projectDir = pluginDirectory
}

...可能会升级到其settings.gradle.kts等效项

kts
pluginManagement {
    val flutterSdkPath = run {
        val properties = java.util.Properties()
        file("local.properties").inputStream().use { properties.load(it) }
        val flutterSdkPath = properties.getProperty("flutter.sdk")
        require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
        flutterSdkPath
    }

    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    // Note the use of the flutter-plugin-loader versus reading '.flutter-plugins'
    id("dev.flutter.flutter-plugin-loader") version "1.0.0"
    id("com.android.application") version "8.1.0" apply false
    id("org.jetbrains.kotlin.android") version "1.8.22" apply false
}

include(":app")

有关切换到较新插件DSL的详细信息,请参阅Flutter Gradle 插件的弃用命令式应用

要对您的构建是否依赖于.flutter-plugins文件进行冒烟测试,您可以使用功能标志explicit-package-dependencies

sh
flutter config explicit-package-dependencies

任何可能依赖于该文件输出的构建工具或脚本现在都将失败。

时间线

#

未发布

未发布 + 1,将删除.flutter-plugins支持。

参考

#

相关问题

  • 问题 48918,其中.flutter-plugins(在 2020 年)计划弃用。

相关 PR

  • PR 45379,其中最初添加了.flutter-plugins-dependencies
  • PR 157388,其中向 Flutter Android 构建脚本添加了警告。