A multi-thread tool to download content from Pub. Then the result can be served by a http server and taken as the backend of pub, flutter or even Pub Mirror itself.
With this tool, you can build a local mirror of pub with no need of unstable reverse proxy or dynamic server like pub_server.
It can be installed from pub by:
$ pub global activate pub_mirror
or installed as a docker image by:
$ docker pull huiyiqun/pub_mirror
or installed from source directly by:
$ cd path/to/pub-mirror
$ pub get
# then it can be run by following command
$ dart bin/dart_mirror.dart
$ pub_mirror --help
Usage:
pub_mirror [options] <dest-path> <serving-url>
Example: pub_mirror /tmp/pub/ file:///tmp/pub/
Options:
-h, --help print usage and exit
-v, --verbose more verbose output
-o, --[no-]overwrite overwrite existing meta files
-u, --upstream the upstream to mirror from
(defaults to "https://pub.dartlang.org/api")
-c, --connections max number of connections
(defaults to "10")
-p, --concurrency max number of packages to download in parallel
(defaults to "1")
The dest-path
is where you would like to save the packages and serving-url
is the base url that you would like to serving on.
file:///tmp/pub/ is just used as an example, the file scheme is not supported by pub.
The packages are downloaded incrementally, which means:
- If the process is interrupted and resumed, packages and versions has been downloaded will be skipped.
- If the process is completed and restarted again, only new packages and new releases will be downloaded.
In order to make the mirror accessible by the client, we must serve it with a web server.
An example for nginx is:
http {
server {
listen 80; # identical to the scheme port in the serving-url
listen ssl 443; # if the scheme in the serving-url is https
server_name example.com; # identical to the hostname in the serving-url
location /pub/ { # identical to the path in the serving-url
root path/to/path; # identical to the dest-path
location /pub/api/ {
try_files $uri $uri/meta.json =404; # information of packages and versions are saved in meta.json
}
}
}
}
Start the nginx and enjoy the speed!
To test the configuration of the web server, You can visit following URLs:
- http://example.com/pub/api/packages # a large json file
- http://example.com/pub/api/packages/pub_mirror # a json file
- http://example.com/pub/api/packages/pub_mirror/versions/0.1.0 # a json file
- http://example.com/pub/packages/pub_mirror/versions/0.1.0.tar.gz # an archive file
Setting the environment PUB_HOSTED_URL
to the serving-url
, then both pub
and flutter
will download packages from your mirror.
$ export PUB_HOSTED_URL="http://example.com/pub/"
$ pub get # downloaded from http://example.com/pub/
$ flutter packages get # downloaded from http://example.com/pub/
Dart repo of TUNA mirrors is served by this tool.