您好,我正在尝试对我的应用程序中找到的代码进行重复数据删除settings.gradle。这是我的文件当前的样子:
pluginManagement {\n def localPropertiesFile = new File(rootProject.projectDir, "local.properties")\n def properties = new Properties()\n assert localPropertiesFile.exists()\n localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }\n def flutterSdkPath = properties.getProperty("flutter.sdk")\n assert flutterSdkPath != null, "flutter.sdk not set in local.properties"\n\n includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")\n\n plugins {\n id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false\n }\n}\n\ninclude \':app\'\n\ndef localPropertiesFile = new File(rootProject.projectDir, "local.properties")\ndef properties = new Properties()\nassert localPropertiesFile.exists()\nlocalPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }\ndef flutterSdkPath = properties.getProperty("flutter.sdk")\nassert flutterSdkPath != null, "flutter.sdk not set in local.properties"\napply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"\nRun Code Online (Sandbox Code Playgroud)\n(您可以忽略特定于技术的事情以及为什么必须像这样完成 \xe2\x80\x93 让我们假设它必须像这样完成。如果您对更多详细信息感兴趣,请参阅这个 PR 到 Flutter)
\n很容易看出负责flutter.sdk从local.properties文件加载属性的代码被重复了两次。所以我开始着手删除这个重复的内容。
首先,我尝试了下面的代码,但 Gradle 很快提醒我“pluginManagement {} 块必须出现在脚本中任何其他语句之前”。
\ndef localPropertiesFile = new File(rootProject.projectDir, "local.properties")\ndef properties = new Properties()\nassert localPropertiesFile.exists()\nlocalPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }\ndef flutterSdkPath = properties.getProperty("flutter.sdk")\nassert flutterSdkPath != null, "flutter.sdk not set in local.properties"\n\npluginManagement {\n includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")\n\n plugins {\n id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false\n }\n}\n\ninclude \':app\'\n\napply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"\n\nRun Code Online (Sandbox Code Playgroud)\n\n上一次尝试中的错误消息表明块之前不允许有任何语句pluginManagement {}。我考虑过将代码移动到一个单独的函数中,因为根据我(谦虚的)理解,函数不是 Groovy 中的语句:
String flutterSdkPath() {\n def localPropertiesFile = new File(rootProject.projectDir, "local.properties")\n def properties = new Properties()\n assert localPropertiesFile.exists()\n localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }\n def flutterSdkPath = properties.getProperty("flutter.sdk")\n assert flutterSdkPath != null, "flutter.sdk not set in local.properties"\n return flutterSdkPath\n}\n\npluginManagement {\n includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")\n\n plugins {\n id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false\n }\n}\n\ninclude \':app\'\n\napply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"\nRun Code Online (Sandbox Code Playgroud)\n不幸的是,它仍然不起作用,并且该错误的帮助也越来越小:
\nFAILURE: Build failed with an exception.\n\n* Where:\nSettings file \'/Users/bartek/fvm/versions/master/examples/hello_world/android/settings.gradle\' line: 20\n\n* What went wrong:\nA problem occurred evaluating settings \'android\'.\n> Could not get unknown property \'flutterSdkPath\' for object of type org.gradle.plugin.management.internal.DefaultPluginManagementSpec.\nRun Code Online (Sandbox Code Playgroud)\n我很确定它必须与 Gradle 以特殊方式处理如何阻止有关(也就是说,首先评估它,然后再评估pluginManagement {}其余代码)settings.gradle
我认为也许该块之前的所有代码都pluginManagement {}以某种方式被剥离(?),所以我尝试创建一个带有静态方法的类:
pluginManagement {\n includeBuild("${Flutter.flutterSdkPath}/packages/flutter_tools/gradle")\n\n plugins {\n id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false\n }\n}\n\ninclude \':app\'\n\napply from: "${Flutter.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle"\n\nclass Flutter {\n String flutterSdkPath() {\n def localPropertiesFile = new File(rootProject.projectDir, "local.properties")\n def properties = new Properties()\n assert localPropertiesFile.exists()\n localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }\n def flutterSdkPath = properties.getProperty("flutter.sdk")\n assert flutterSdkPath != null, "flutter.sdk not set in local.properties"\n return flutterSdkPath\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n这次错误消息的帮助就更小了:
\n* Where:\nSettings file \'/Users/bartek/fvm/versions/master/examples/hello_world/android/settings.gradle\' line: 11\n\n* What went wrong:\nA problem occurred evaluating settings \'android\'.\n> Flutter\n\n* Try:\n> Run with --stacktrace option to get the stack trace.\n> Run with --info or --debug option to get more log output.\n> Run with --scan to get full insights.\nRun Code Online (Sandbox Code Playgroud)\n使用该--stracktrace标志运行 Gradle 后,我注意到这一行:
... (<very long stack trace>)\nCaused by: java.lang.NoClassDefFoundError: Flutter\n...\nRun Code Online (Sandbox Code Playgroud)\n看起来与我在尝试 2) 中遇到的问题相同。
\n关于如何将属性加载代码移动到单个位置并从pluginManagement {}块的内部和外部调用它,我没有更多的想法。
我认为 Gradle 设置插件可以在这里工作,但除非必要,否则我不想这样做。
\n\n\n不幸的是,它仍然无法\xe2\x80\x99 工作,并且错误只是变得不太有用:
\n
它表示找不到您尝试引用的属性,因为当您将其设置为方法时,不再存在此类属性。
\n如果您尝试调用该方法,它会告诉您找不到该方法。
\n\n\nI\xe2\x80\x99m 非常确定它必须与 Gradle 以特殊方式处理如何阻止有关(也就是说,它\xe2\x80\x99s 首先评估,然后再评估
\npluginManagement {}其余代码)settings.gradle
确切地说,它是单独提取和评估的。\npluginManagement块可以定义插件存储库或包含带有设置插件的构建,因此要编译脚本的其余部分,需要首先单独评估它。\n这也是您不能使用属性的原因或来自块外部的方法。\n它必须是独立的。
\n\n我认为也许该块之前的
\npluginManagement {}所有代码 \xe2\x80\x99s都以某种方式被剥离(?),所以我尝试创建一个带有静态方法的类:
正如我所说,所有内容都被“剥离”,否则您也可以简单地在块之后定义方法并调用它。
\n\n\n我认为 Gradle 设置插件可以在这里工作,但除非必要,否则我\xe2\x80\x99d 不喜欢这样做。
\n
不,由于母鸡和鸡蛋的问题,这不会有帮助。\n设置插件在块之后评估,pluginManagement因为该块可以使用设置插件或存储库来定义包含的构建,在其中可以找到设置插件,因此设置插件来得太晚了配置该块。
\n\nPS I\xe2\x80\x99d 也很高兴地接受关于为什么我在尝试 1) 早期遇到错误的解释,但在尝试 (2) 中却没有。
\n
不确定你所说的“早期”是什么意思,这两个错误或多或少都会立即出现。\n就在尝试 1 中,你在 Groovy DSL 中不允许的块之前有语句(它在 Kotlin DSL 中是允许的,但也不能工作)在块内部使用),因此在解析脚本以提取块时会出现错误,而在尝试 2 中,在实际评估块时会出现错误,因为它使用了不存在的属性。
\n您可以通过使用“额外”属性来实现您想要实现的目标。\n使用它们通常是一种代码味道,并且只是一种解决方法,以解决未正确执行某些操作的情况,但这可能是其使用可能会出现问题的罕见情况之一适当。
\n虽然pluginManagment块是单独独立评估的,但它仍然可以修改模型,因此您可以添加一个闭包作为额外属性,然后该属性也可用于其余脚本:
pluginManagement {\n settings.ext.foo = { "Foo" }\n println("1: ${foo()}")\n includeBuild("${foo()}")\n}\n\nprintln("2: ${foo()}")\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |