欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flutter如何通過一行命令解決多個pubspec.yaml文件的依賴項問題

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

前言

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

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

  • Flutter: 3.10.2
  • Dart: 3.0.2

Flutter內(nèi)置命令

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

根據(jù)flutter update-packages命令執(zhí)行時的輸出日志Ran pub get in ...,可以快速定位到update_packages.dart文件(位于Flutter框架項目/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命令。通過這個方法大概也清楚了,其實Flutter是通過遍歷全部項目路徑,然后一個個執(zhí)行pub get命令的方式獲取的依賴項。那項目路徑列表是怎么獲得的呢?

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

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

繼續(xù)找下去會發(fā)現(xiàn),F(xiàn)lutter其實也是通過遞歸找到項目路徑(包含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用的方法也蠻簡單的,大家一般也都能想的到。

一行命令實現(xiàn)

1. 命令使用

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

完整命令如下:

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

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

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

2. 命令解釋

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

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

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

3. 命令擴展

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

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

最后

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

相關(guān)文章

  • Android切面編程知識點詳解

    Android切面編程知識點詳解

    這篇文章給大家整理了關(guān)于Android進階資深開發(fā)必備技能-切面編程的相關(guān)知識點內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。
    2018-07-07
  • Android模擬實現(xiàn)滑動解鎖界面

    Android模擬實現(xiàn)滑動解鎖界面

    這篇文章主要為大家詳細介紹了Android模擬實現(xiàn)滑動解鎖界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android 簡單封裝獲取驗證碼倒計時功能

    Android 簡單封裝獲取驗證碼倒計時功能

    倒計時效果相信大家都不陌生,我們可以使用很多種方法去實現(xiàn)此效果,這里自己采用 CountDownTimer 定時器簡單封裝下此效果,方便我們隨時調(diào)用。下面小編給大家分享android驗證碼倒計時封裝方法,感興趣的朋友一起看看吧
    2018-01-01
  • Android 劉海屏適配總結(jié)(推薦)

    Android 劉海屏適配總結(jié)(推薦)

    這篇文章主要介紹了Android 劉海屏適配總結(jié)(推薦),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Android實現(xiàn)Unity3D下RTMP推送的示例

    Android實現(xiàn)Unity3D下RTMP推送的示例

    像Unity3D下的RTMP或RTSP播放器一樣,好多開發(fā)者苦于在Unity環(huán)境下,如何高效率低延遲的把數(shù)據(jù)采集并編碼實時推送到流媒體服務(wù)器,實現(xiàn)Unity場景下的低延遲推拉流方案。本文介紹幾種RTMP推送的方案
    2021-06-06
  • Android監(jiān)聽系統(tǒng)來電并彈出提示窗口

    Android監(jiān)聽系統(tǒng)來電并彈出提示窗口

    本篇文章主要介紹了Android監(jiān)聽系統(tǒng)來電并彈出提示窗口,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Android Studio中Logcat寫入和查看日志

    Android Studio中Logcat寫入和查看日志

    大家好,本篇文章主要講的是Android Studio中Logcat寫入和查看日志,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Android Bitmap的加載優(yōu)化與Cache相關(guān)介紹

    Android Bitmap的加載優(yōu)化與Cache相關(guān)介紹

    這篇文章主要介紹了Android中性能優(yōu)化之Bitmap的加載優(yōu)化與Cache相關(guān)內(nèi)容介紹,文中介紹的很詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-02-02
  • Android自定義View實現(xiàn)圓形切圖效果

    Android自定義View實現(xiàn)圓形切圖效果

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)圓形切圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android編程獲取設(shè)備MAC地址的實現(xiàn)方法

    Android編程獲取設(shè)備MAC地址的實現(xiàn)方法

    這篇文章主要介紹了Android編程獲取設(shè)備MAC地址的實現(xiàn)方法,涉及Android針對硬件設(shè)備的操作技巧,需要的朋友可以參考下
    2017-01-01

最新評論