最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter如何通過(guò)一行命令解決多個(gè)pubspec.yaml文件的依賴項(xiàng)問(wèn)題

 更新時(shí)間:2023年06月12日 14:49:04   作者:crasowas  
這篇文章主要介紹了Flutter如何通過(guò)一行命令解決多個(gè)pubspec.yaml文件的依賴項(xiàng)問(wèn)題,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

項(xiàng)目為了模塊化,創(chuàng)建了一堆PackagePlugin,這么做沒什么問(wèn)題,但是遇到Flutter SDK目錄路徑變化或者其他一些情況導(dǎo)致需要重新獲取依賴項(xiàng)時(shí)就麻煩了。麻煩之處在于需要在每個(gè)pubspec.yaml文件所在的目錄中運(yùn)行flutter pub get命令,雖然也不是什么大問(wèn)題,但是這種重復(fù)簡(jiǎn)單的操作實(shí)在不想做。

開發(fā)環(huán)境

  • Flutter: 3.10.2
  • Dart: 3.0.2

Flutter內(nèi)置命令

如果你研究過(guò)Flutter SDK(Flutter框架項(xiàng)目),那么你對(duì)flutter update-packages命令一定不陌生,執(zhí)行這個(gè)命令可以獲取Flutter框架項(xiàng)目所需要的全部依賴項(xiàng),避免一個(gè)個(gè)去執(zhí)行flutter pub get命令??上н@個(gè)命令只能用于Flutter框架項(xiàng)目,不過(guò)我們可以先看看Flutter是怎么做的,然后自己實(shí)現(xiàn)一個(gè)。

根據(jù)flutter update-packages命令執(zhí)行時(shí)的輸出日志Ran pub get in ...,可以快速定位到update_packages.dart文件(位于Flutter框架項(xiàng)目/packages/flutter_tools/lib/src/commands目錄)中的_runPubGetOnPackages方法:

screenshot1

Future<void> _runPubGetOnPackages(List<Directory> packages) async {
  ...
  try {
    ...
    for (final Directory dir in packages) {
      unawaited(queue.add(() async {
        final Stopwatch stopwatch = Stopwatch();
        stopwatch.start();
        await pub.get(
          context: PubContext.updatePackages,
          project: FlutterProject.fromDirectory(dir),
          // All dependencies should already have been downloaded by the fake
          // package, so the concurrent checks can all happen offline.
          offline: true,
          outputMode: PubOutputMode.none,
        );
        stopwatch.stop();
        final double seconds = stopwatch.elapsedMilliseconds / 1000.0;
        final String relativeDir = globals.fs.path.relative(dir.path, from: Cache.flutterRoot);
        globals.printStatus('Ran pub get in $relativeDir in ${seconds.toStringAsFixed(1)}s...');
      }));
      count += 1;
    }
    ...
  } catch (exception) { // ignore: avoid_catches_without_on_clauses
    status.cancel();
    rethrow;
  }
  ...
}

pub.get方法的作用就是執(zhí)行pub get命令。通過(guò)這個(gè)方法大概也清楚了,其實(shí)Flutter是通過(guò)遍歷全部項(xiàng)目路徑,然后一個(gè)個(gè)執(zhí)行pub get命令的方式獲取的依賴項(xiàng)。那項(xiàng)目路徑列表是怎么獲得的呢?

根據(jù)_runPubGetOnPackages方法的調(diào)用,找到packages初始化的位置:

@override
Future<FlutterCommandResult> runCommand() async {
  final List<Directory> packages = runner!.getRepoPackages();
  ...
  await _runPubGetOnPackages(packages);
  return FlutterCommandResult.success();
}

繼續(xù)找下去會(huì)發(fā)現(xiàn),F(xiàn)lutter其實(shí)也是通過(guò)遞歸找到項(xiàng)目路徑(包含pubspec.yaml文件的目錄路徑):

static List<String> _gatherProjectPaths(String rootPath) {
  if (globals.fs.isFileSync(globals.fs.path.join(rootPath, '.dartignore'))) {
    return <String>[];
  }
  final List<String> projectPaths = globals.fs.directory(rootPath)
    .listSync(followLinks: false)
    .expand((FileSystemEntity entity) {
      if (entity is Directory && !globals.fs.path.split(entity.path).contains('.dart_tool')) {
        return _gatherProjectPaths(entity.path);
      }
      return <String>[];
    })
    .toList();
  if (globals.fs.isFileSync(globals.fs.path.join(rootPath, 'pubspec.yaml'))) {
    projectPaths.add(rootPath);
  }
  return projectPaths;
}

這么一分析,好像Flutter用的方法也蠻簡(jiǎn)單的,大家一般也都能想的到。

一行命令實(shí)現(xiàn)

1. 命令使用

按照這個(gè)思路,我首先想到可以寫一個(gè)shell腳本,遞歸遍歷出全部的項(xiàng)目路徑,然后再挨個(gè)執(zhí)行flutter pub get命令,結(jié)果寫著寫著發(fā)現(xiàn)完全用不到shell腳本,一行命令就可以解決了。

完整命令如下:

find [path] -name "pubspec.yaml" -exec dirname {} \; | xargs -I {} flutter pub get -C {}

注意,使用時(shí)請(qǐng)將命令中的[path]替換為你的Flutter項(xiàng)目路徑。如果命令就在Flutter項(xiàng)目路徑下執(zhí)行,那么可以直接使用以下命令(.表示當(dāng)前路徑):

find . -name "pubspec.yaml" -exec dirname {} \; | xargs -I {} flutter pub get -C {}

2. 命令解釋

命令主要分前后兩部分,用管道符|分割,前半部分用于查找所有的項(xiàng)目路徑,后半部分用于獲取全部的依賴項(xiàng)。

  • find [path] -name "pubspec.yaml":在指定的路徑中遞歸查找所有名稱為pubspec.yaml的文件
  • -exec dirname {} \;:對(duì)于找到的每個(gè)文件,執(zhí)行dirname命令獲取目錄路徑
  • |:管道符,將前一個(gè)命令的輸出傳遞給下一個(gè)命令
  • xargs -I {} flutter pub get -C {}:xargs 命令的作用是將管道傳遞的輸入轉(zhuǎn)換為命令行參數(shù),-I 選項(xiàng)用于指定替換字符串 {}。簡(jiǎn)單來(lái)說(shuō),每一個(gè)項(xiàng)目路徑都會(huì)轉(zhuǎn)化為flutter pub get -C 項(xiàng)目路徑命令執(zhí)行

可以通過(guò)執(zhí)行man findman xargs命令獲取更多關(guān)于findxargs命令的使用方法。

3. 命令擴(kuò)展

前面的命令用于獲取全部依賴項(xiàng),稍微修改后同樣也可以用于升級(jí)全部依賴項(xiàng):

find [path] -name "pubspec.yaml" -exec dirname {} \; | xargs -I {} flutter pub upgrade -C {}

最后

到此這篇關(guān)于Flutter如何通過(guò)一行命令解決多個(gè)pubspec.yaml文件的依賴項(xiàng)問(wèn)題的文章就介紹到這了,更多相關(guān)Flutter pubspec.yaml文件的依賴項(xiàng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android事件分發(fā)機(jī)制(下) View的事件處理

    Android事件分發(fā)機(jī)制(下) View的事件處理

    這篇文章主要介紹了Android事件分發(fā)機(jī)制下篇, View的事件處理的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android編程之界面實(shí)現(xiàn)全屏顯示的方法(2種方法)

    Android編程之界面實(shí)現(xiàn)全屏顯示的方法(2種方法)

    這篇文章主要介紹了Android編程之界面實(shí)現(xiàn)全屏顯示的方法,結(jié)合實(shí)例分析了Java代碼中設(shè)置與Manifest文件設(shè)置2種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2016-01-01
  • 詳解Android應(yīng)用沙盒機(jī)制

    詳解Android應(yīng)用沙盒機(jī)制

    這篇文章主要介紹了Android應(yīng)用沙盒機(jī)制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • Android數(shù)據(jù)流之Channel和Flow實(shí)現(xiàn)原理和技巧詳解

    Android數(shù)據(jù)流之Channel和Flow實(shí)現(xiàn)原理和技巧詳解

    在 Android 應(yīng)用程序的開發(fā)中,處理異步數(shù)據(jù)流是一個(gè)常見的需求,為了更好地應(yīng)對(duì)這些需求,Kotlin 協(xié)程引入了 Channel 和 Flow,它們提供了強(qiáng)大的工具來(lái)處理數(shù)據(jù)流,本文將深入探討 Channel 和 Flow 的內(nèi)部實(shí)現(xiàn)原理、高級(jí)使用技巧以及如何在 Android 開發(fā)中充分利用它們
    2023-11-11
  • Android Studio 透明狀態(tài)欄的實(shí)現(xiàn)示例

    Android Studio 透明狀態(tài)欄的實(shí)現(xiàn)示例

    這篇文章主要介紹了Android Studio 透明狀態(tài)欄的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 懸浮對(duì)話框Android代碼實(shí)現(xiàn)

    懸浮對(duì)話框Android代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了懸浮對(duì)話框Android代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android源碼 在Ubuntu上下載,編譯和安裝

    Android源碼 在Ubuntu上下載,編譯和安裝

    本文主要介紹在Ubuntu 上Android的源碼,想深入學(xué)習(xí)Android的朋友肯定都有學(xué)習(xí)Android的源代碼,這里就幫大家介紹下載,安裝,編譯源碼的詳細(xì)步驟
    2016-08-08
  • Android仿美團(tuán)外賣菜單界面

    Android仿美團(tuán)外賣菜單界面

    這篇文章主要為大家詳細(xì)介紹了Android仿美團(tuán)外賣菜單界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 用Flutter開發(fā)自定義Plugin的方法示例

    用Flutter開發(fā)自定義Plugin的方法示例

    這篇文章主要介紹了用Flutter開發(fā)自定義Plugin的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Android開源組件SlidingMenu側(cè)滑菜單使用介紹

    Android開源組件SlidingMenu側(cè)滑菜單使用介紹

    這篇文章主要介紹了Android開源組件SlidingMenu側(cè)滑菜單使用介紹,本文給出了SlidingMenu的項(xiàng)目地址、使用代碼、使用配置、常用的一些屬性設(shè)置中文注解等內(nèi)容,需要的朋友可以參考下
    2015-01-01

最新評(píng)論

孟州市| 景德镇市| 南涧| 金阳县| 陇川县| 通辽市| 义马市| 自贡市| 元阳县| 靖远县| 武乡县| 察哈| 奉贤区| 鹰潭市| 无极县| 永善县| 洮南市| 德庆县| 宽城| 彩票| 芜湖市| 蓝田县| 蚌埠市| 富裕县| 治多县| 古交市| 朔州市| 云阳县| 许昌市| 霍山县| 安溪县| 平原县| 白城市| 萝北县| 桑植县| 丰原市| 疏附县| 金乡县| 高雄市| 神池县| 平遥县|