dart pub私有仓库搭建、私有仓库上传方法、上传工具定制

13 篇文章 0 订阅
1 篇文章 0 订阅

dart 的官方网站提供了一个simple dart server,具体使用方法参考相关github的地址。

https://github.com/dart-lang/pub_server

我们选了一个PC作为服务器,24小时不关机。然后在内网中部署服务。

配置好后,服务启起来。

主要障碍在于上传的过程需要科学上网,科学上网结束后,又需要切回到内网。

使用flutter 默认的pub client进行上传的步骤:

1、配置fq环境(因为上传过程中需要google验证,需要fq)

2、设置命令行窗口代理 window set https_proxy=https://127.0.0.1:{翻墙工具的本地监听端口}

3、上传前检查配置  flutter packages pub publish --dry-run

4、开始上传 flutter packages pub publish --server=http://10.118.63.101:8080

如果上传过程中没有收到验证,把代理设置为全局模式。

如果第一次上传 uploading。。。卡住,需要多试几次。只要上传成功一次,后面上传就很容易。

如果上传时提示包过大,删除build目录,删除ios目录,删除Android目录。然后重试。

如果工程中没有LICENSE,可以新建一个text文本命名为LICENSE,内容 可以为空。

如果上传地址不对,最好插件的pubspec.yaml中也加入 publish_to: http://10.118.63.101:8080

国庆到了,突然诸多科学上网工具都不好使了。这于是非常不方便了,开发的dart插件无法上传。

很自然想到,有没有办法自己写个dart pub工具,于是去找系统的pub工具是怎样执行的。

发现执行的是一个pub.dart.snapshot文件。这是一个dart库打包构建后的产物。

那么如果能够把dart pub client中oauth google认证的流程给去掉,不就可以了吗?

dart是开源的,dart pub tool应该也是开源的,于是找找看。

没想到找到了:https://github.com/dart-lang/pub

有个lish文件,包含了publish命令,找到关键代码。

Future _publish(List<int> packageBytes) async {
    Uri cloudStorageUrl;
    try {
      await oauth2.withClient(cache, (client) {
        return log.progress('Uploading', () async {
          // TODO(nweiz): Cloud Storage can provide an XML-formatted error. We
          // should report that error and exit.
          var newUri = server.resolve("/api/packages/versions/new");
          var response = await client.get(newUri, headers: pubApiHeaders);
          var parameters = parseJsonResponse(response);

          var url = _expectField(parameters, 'url', response);
          if (url is! String) invalidServerResponse(response);
          cloudStorageUrl = Uri.parse(url);
          var request = http.MultipartRequest('POST', cloudStorageUrl);

          var fields = _expectField(parameters, 'fields', response);
          if (fields is! Map) invalidServerResponse(response);
          fields.forEach((key, value) {
            if (value is! String) invalidServerResponse(response);
            request.fields[key] = value;
          });

          request.followRedirects = false;
          request.files.add(http.MultipartFile.fromBytes('file', packageBytes,
              filename: 'package.tar.gz'));
          var postResponse =
              await http.Response.fromStream(await client.send(request));

          var location = postResponse.headers['location'];
          if (location == null) throw PubHttpException(postResponse);
          handleJsonSuccess(await client.get(location, headers: pubApiHeaders));
        });
      });
    } on PubHttpException catch (error) {
      var url = error.response.request.url;
      if (url == cloudStorageUrl) {
        // TODO(nweiz): the response may have XML-formatted information about
        // the error. Try to parse that out once we have an easily-accessible
        // XML parser.
        fail(log.red('Failed to upload the package.'));
      } else if (Uri.parse(url.origin) == Uri.parse(server.origin)) {
        handleJsonError(error.response);
      } else {
        rethrow;
      }
    }
  }

重点在于删掉外层的oauth2.withClient(),里面的client替换成自己的http.Client()。

  Future _publish(List<int> packageBytes) async {
    Uri cloudStorageUrl;
    try {
//      await oauth2.withClient(cache, (client) {
        var httpClient =http.Client();
        return log.progress('Uploading', () async {
          // TODO(nweiz): Cloud Storage can provide an XML-formatted error. We
          // should report that error and exit.
          var newUri = server.resolve("/api/packages/versions/new");
//          var uri=Uri(scheme: "http", host: "$newUri", queryParameters: pubApiHeaders);
          var response = await httpClient.get(newUri, headers: pubApiHeaders);
//          var response = await httpClient.get(uri);
          var parameters = parseJsonResponse(response);

          var url = _expectField(parameters, 'url', response);
          if (url is! String) invalidServerResponse(response);
          cloudStorageUrl = Uri.parse(url);
          var request = http.MultipartRequest('POST', cloudStorageUrl);

          var fields = _expectField(parameters, 'fields', response);
          if (fields is! Map) invalidServerResponse(response);
          fields.forEach((key, value) {
            if (value is! String) invalidServerResponse(response);
            request.fields[key] = value;
          });

          request.followRedirects = false;
          request.files.add(http.MultipartFile.fromBytes('file', packageBytes,
              filename: 'package.tar.gz'));
          var postResponse =
              await http.Response.fromStream(await httpClient.send(request));

          var location = postResponse.headers['location'];
          if (location == null) throw PubHttpException(postResponse);
          handleJsonSuccess(await httpClient.get(location, headers: pubApiHeaders));
        });
//      });
    } on PubHttpException catch (error) {
      var url = error.response.request.url;
      if (url == cloudStorageUrl) {
        // TODO(nweiz): the response may have XML-formatted information about
        // the error. Try to parse that out once we have an easily-accessible
        // XML parser.
        fail(log.red('Failed to upload the package.'));
      } else if (Uri.parse(url.origin) == Uri.parse(server.origin)) {
        handleJsonError(error.response);
      } else {
        rethrow;
      }
    }
  }

可以选择编译成自己的snapshot文件,命令形式如下。

dart [--package_root=<path>] --snapshot=<output_file> <dart_file>
dart --snapshot=my.dart.snapshot D:\code\pub-master\bin\pub.dart

生成的产物如下

dart my.dart.snapshot xxx工程的路径

很快就成功了,再也没有认证过程来烦恼了。

修改后的文件:https://github.com/ameryzhu/pub/blob/master/lib/src/command/lish.dart

完整的folk库:

https://github.com/ameryzhu/pub

使用方式:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您在使用Dartpub命令时遇到了问题。这个错误提示表明您的计算机上没有安装Dart SDK,或者没有将Dart SDK的路径添加到系统环境变量中。 要解决这个问题,您可以按照以下步骤进行操作: 1. 首先,请确保您已经安装了Dart SDK。您可以从Dart官方网站(https://dart.dev/get-dart)下载适合您操作系统的Dart SDK,并按照官方文档上的步骤进行安装。 2. 在安装完成后,您需要将Dart SDK的路径添加到系统环境变量中。具体的步骤可能因操作系统而异,以下是一般的步骤: - 对于Windows用户,您可以通过以下步骤将Dart SDK的路径添加到系统环境变量中: - 打开“控制面板”,点击“系统和安全”。 - 点击“系统”,然后点击“高级系统设置”。 - 在弹出的窗口中,点击“环境变量”按钮。 - 在“系统变量”部分,找到名为“Path”的变量,并双击它。 - 在弹出的编辑窗口中,点击“新建”按钮,并将Dart SDK的路径添加到新的行中。 - 点击“确定”保存更改。 - 对于macOS和Linux用户,您可以通过编辑相应的配置文件来添加环境变量: - 打开终端,并输入以下命令打开配置文件: ``` nano ~/.bash_profile ``` - 在打开的文件中,添加以下行来设置环境变量: ``` export PATH="$PATH:/path/to/dart/sdk/bin" ``` - 按下Ctrl + X保存更改,然后按Y确认保存,最后按Enter键退出编辑器。 - 最后,运行以下命令以使更改生效: ``` source ~/.bash_profile ``` 3. 完成上述步骤后,重新打开终端或命令提示符窗口,并尝试再次运行pub命令。现在,您应该能够成功执行pub命令了。 希望以上信息能够帮助您解决问题。如果您有任何其他疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值