mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

The purpose of this PR is to make it so that when the user runs 'flutter', if they have a .pub-cache directory in their flutter root, we use that instead of the default location for the pub cache. Otherwise, it should act as before. The eventual goal is to support a pre-populated flutter .zip/.tar.gz file that has everything the developer needs in one bundle. In order for that to actually work, we need to have the pub cache be self-contained, and not in the user's home dir. Another advantage of this is that if you have multiple flutter repos that you're switching between, then the versions in the pub cache will remain static when you switch between them.
121 lines
4.2 KiB
Bash
Executable File
121 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# Copyright 2015 The Chromium Authors. All rights reserved.
|
||
# Use of this source code is governed by a BSD-style license that can be
|
||
# found in the LICENSE file.
|
||
|
||
|
||
# ---------------------------------- NOTE ---------------------------------- #
|
||
#
|
||
# Please keep the logic in this file consistent with the logic in the
|
||
# `flutter.bat` script in the same directory to ensure that Flutter continues
|
||
# to work across all platforms!
|
||
#
|
||
# -------------------------------------------------------------------------- #
|
||
|
||
set -e
|
||
|
||
function follow_links() {
|
||
cd -P "${1%/*}"
|
||
local file="$PWD/${1##*/}"
|
||
while [ -h "$file" ]; do
|
||
# On Mac OS, readlink -f doesn't work.
|
||
cd -P "${file%/*}"
|
||
file="$(readlink "$file")"
|
||
cd -P "${file%/*}"
|
||
file="$PWD/${file##*/}"
|
||
done
|
||
echo "$PWD/${file##*/}"
|
||
}
|
||
|
||
# Convert a filesystem path to a format usable by Dart's URI parser.
|
||
function path_uri() {
|
||
# Reduce multiple leading slashes to a single slash.
|
||
echo "$1" | sed -E -e "s,^/+,/,"
|
||
}
|
||
|
||
function upgrade_flutter () {
|
||
if hash flock 2>/dev/null; then
|
||
flock 3 # ensures that we don't simultaneously update Dart in multiple parallel instances
|
||
# some platforms (e.g. Mac) don't have flock or any reliable alternative
|
||
fi
|
||
|
||
local revision=`(cd "$FLUTTER_ROOT"; git rev-parse HEAD)`
|
||
if [ ! -f "$SNAPSHOT_PATH" ] || [ ! -s "$STAMP_PATH" ] || [ `cat "$STAMP_PATH"` != "$revision" ] || [ "$FLUTTER_TOOLS_DIR/pubspec.yaml" -nt "$FLUTTER_TOOLS_DIR/pubspec.lock" ]; then
|
||
mkdir -p "$FLUTTER_ROOT/bin/cache"
|
||
touch "$FLUTTER_ROOT/bin/cache/.dartignore"
|
||
"$FLUTTER_ROOT/bin/internal/update_dart_sdk.sh"
|
||
|
||
echo Building flutter tool...
|
||
if [ "$TRAVIS" == "true" ] || [ "$BOT" == "true" ] || [ "$CONTINUOUS_INTEGRATION" == "true" ] || [ "$CHROME_HEADLESS" == "1" ] || [ "$APPVEYOR" == "true" ] || [ "$CI" == "true" ]; then
|
||
PUB_ENVIRONMENT="$PUB_ENVIRONMENT:flutter_bot"
|
||
fi
|
||
export PUB_ENVIRONMENT="$PUB_ENVIRONMENT:flutter_install"
|
||
|
||
if [ -d "$FLUTTER_ROOT/.pub-cache" ]; then
|
||
export PUB_CACHE="${PUB_CACHE:-"$FLUTTER_ROOT/.pub-cache"}"
|
||
fi
|
||
|
||
while : ; do
|
||
cd "$FLUTTER_TOOLS_DIR"
|
||
"$PUB" upgrade --verbosity=error --no-packages-dir && break
|
||
echo Error: Unable to 'pub upgrade' flutter tool. Retrying in five seconds...
|
||
sleep 5
|
||
done
|
||
"$DART" --snapshot="$SNAPSHOT_PATH" --packages="$FLUTTER_TOOLS_DIR/.packages" "$SCRIPT_PATH"
|
||
echo "$revision" > "$STAMP_PATH"
|
||
fi
|
||
}
|
||
|
||
PROG_NAME="$(path_uri "$(follow_links "$BASH_SOURCE")")"
|
||
BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
|
||
export FLUTTER_ROOT="$(cd "${BIN_DIR}/.." ; pwd -P)"
|
||
|
||
FLUTTER_TOOLS_DIR="$FLUTTER_ROOT/packages/flutter_tools"
|
||
SNAPSHOT_PATH="$FLUTTER_ROOT/bin/cache/flutter_tools.snapshot"
|
||
STAMP_PATH="$FLUTTER_ROOT/bin/cache/flutter_tools.stamp"
|
||
SCRIPT_PATH="$FLUTTER_TOOLS_DIR/bin/flutter_tools.dart"
|
||
DART_SDK_PATH="$FLUTTER_ROOT/bin/cache/dart-sdk"
|
||
|
||
DART="$DART_SDK_PATH/bin/dart"
|
||
PUB="$DART_SDK_PATH/bin/pub"
|
||
|
||
# Test if running as superuser – but don't warn if running within Docker
|
||
if [[ "$EUID" == "0" ]] && ! [[ -f /.dockerenv ]]; then
|
||
echo " Woah! You appear to be trying to run flutter as root."
|
||
echo " We strongly recommend running the flutter tool without superuser privileges."
|
||
echo " /"
|
||
echo "📎"
|
||
fi
|
||
|
||
# Test if Git is available on the Host
|
||
if ! hash git 2>/dev/null; then
|
||
echo "Error: Unable to find git in your PATH."
|
||
exit 1
|
||
fi
|
||
# Test if the flutter directory is a git clone (otherwise git rev-parse HEAD would fail)
|
||
if [ ! -d "$FLUTTER_ROOT/.git" ]; then
|
||
echo "Error: The Flutter directory is not a clone of the GitHub project."
|
||
exit 1
|
||
fi
|
||
|
||
FLUTTER_TOOL_ARGS="--assert-initializer $FLUTTER_TOOL_ARGS"
|
||
# To debug the tool, you can uncomment the following lines to enable checked mode and set an observatory port:
|
||
# FLUTTER_TOOL_ARGS="--checked $FLUTTER_TOOL_ARGS"
|
||
# FLUTTER_TOOL_ARGS="$FLUTTER_TOOL_ARGS --observe=65432"
|
||
|
||
(upgrade_flutter) 3< "$PROG_NAME"
|
||
|
||
set +e
|
||
"$DART" $FLUTTER_TOOL_ARGS "$SNAPSHOT_PATH" "$@"
|
||
|
||
# The VM exits with code 253 if the snapshot version is out-of-date.
|
||
# If it is, we need to snapshot it again.
|
||
EXIT_CODE=$?
|
||
if [ $EXIT_CODE != 253 ]; then
|
||
exit $EXIT_CODE
|
||
fi
|
||
|
||
set -e
|
||
"$DART" --snapshot="$SNAPSHOT_PATH" --packages="$FLUTTER_TOOLS_DIR/.packages" "$SCRIPT_PATH"
|
||
"$DART" $FLUTTER_TOOL_ARGS "$SNAPSHOT_PATH" "$@"
|