提交 ce3b4547 编写于 作者: A Adam Barth

Merge pull request #2557 from abarth/dot_packages2

Teach SkyShell about .packages files
......@@ -41,8 +41,8 @@ PackageProject() {
local dart_main=${project_path}/lib/main.dart
AssertExists $dart_main
local package_root=${project_path}/packages
AssertExists $package_root
local packages=${project_path}/.packages
AssertExists $packages
# Remove old build artifacts
RunCommand rm -f ${derived_dir}/app.flx
......@@ -62,7 +62,7 @@ PackageProject() {
RunCommand ${FLUTTER_ROOT}/bin/flutter build flx \
--target ${dart_main} \
--output-file ${derived_dir}/app.flx \
--package-root ${package_root} \
--packages ${packages} \
--compiler ${src_dir}/ScriptSnapshotter \
${precompilation_flag} \
......
......@@ -71,7 +71,7 @@
isEnabled = "YES">
</CommandLineArgument>
<CommandLineArgument
argument = "--package-root=$(FLUTTER_APPLICATION_PATH)/packages"
argument = "--packages=$(FLUTTER_APPLICATION_PATH)/.packages"
isEnabled = "YES">
</CommandLineArgument>
</CommandLineArguments>
......
......@@ -49,7 +49,7 @@ interface SkyEngine {
PushRoute(string route);
PopRoute();
RunFromFile(string main, string package_root, string bundle_path);
RunFromFile(string main, string packages, string bundle_path);
RunFromPrecompiledSnapshot(string bundle_path);
RunFromBundle(string script_uri, string bundle_path);
......
......@@ -15,6 +15,7 @@ source_set("dart") {
"//mojo/data_pipe_utils",
"//mojo/public/cpp/application",
"//sky/engine/tonic",
"//sky/engine/tonic/parsers",
"//sky/engine/wtf",
]
}
......@@ -39,18 +39,28 @@ base::FilePath SimplifyPath(const base::FilePath& path) {
} // namespace
DartLibraryProviderFiles::DartLibraryProviderFiles(
const base::FilePath& package_root)
: package_root_(package_root) {
if (package_root_.empty())
package_root_ = base::FilePath(FILE_PATH_LITERAL("packages"));
if (!base::DirectoryExists(package_root_))
package_root_ = base::FilePath();
DartLibraryProviderFiles::DartLibraryProviderFiles() {
}
DartLibraryProviderFiles::~DartLibraryProviderFiles() {
}
void DartLibraryProviderFiles::LoadPackagesMap(const base::FilePath& packages) {
packages_ = base::MakeAbsoluteFilePath(packages);
std::string packages_source;
if (!base::ReadFileToString(packages_, &packages_source)) {
LOG(ERROR) << "error: Unable to load .packages file '"
<< packages_.AsUTF8Unsafe() << "'.";
exit(1);
}
std::string error;
if (!packages_map_.Parse(packages_source, &error)) {
LOG(ERROR) << "error: Unable to parse .packages file '"
<< packages_.AsUTF8Unsafe() << "'.\n" << error;
exit(1);
}
}
void DartLibraryProviderFiles::GetLibraryAsStream(
const std::string& name,
blink::DataPipeConsumerCallback callback) {
......@@ -67,9 +77,20 @@ void DartLibraryProviderFiles::GetLibraryAsStream(
std::string DartLibraryProviderFiles::CanonicalizePackageURL(std::string url) {
DCHECK(base::StartsWithASCII(url, "package:", true));
base::ReplaceFirstSubstringAfterOffset(&url, 0, "package:", "");
CHECK(!package_root_.empty())
<< "Cannot import packages without a valid --package-root";
return package_root_.Append(url).AsUTF8Unsafe();
size_t slash = url.find('/');
if (slash == std::string::npos)
return std::string();
std::string package = url.substr(0, slash);
std::string library_path = url.substr(slash + 1);
std::string package_path = packages_map_.Resolve(package);
if (package_path.empty())
return std::string();
if (base::StartsWithASCII(package_path, "file://", true)) {
base::ReplaceFirstSubstringAfterOffset(&package_path, 0, "file://", "");
return package_path + library_path;
}
auto path = packages_.DirName().Append(package_path).Append(library_path);
return SimplifyPath(path).AsUTF8Unsafe();
}
std::string DartLibraryProviderFiles::CanonicalizeFileURL(std::string url) {
......
......@@ -7,15 +7,18 @@
#include "base/files/file_path.h"
#include "sky/engine/tonic/dart_library_provider.h"
#include "sky/engine/tonic/parsers/packages_map.h"
namespace sky {
namespace shell {
class DartLibraryProviderFiles : public blink::DartLibraryProvider {
public:
explicit DartLibraryProviderFiles(const base::FilePath& package_root);
DartLibraryProviderFiles();
~DartLibraryProviderFiles() override;
void LoadPackagesMap(const base::FilePath& packages);
protected:
// |DartLibraryProvider| implementation:
void GetLibraryAsStream(const std::string& name,
......@@ -26,7 +29,8 @@ class DartLibraryProviderFiles : public blink::DartLibraryProvider {
std::string CanonicalizePackageURL(std::string url);
std::string CanonicalizeFileURL(std::string url);
base::FilePath package_root_;
base::FilePath packages_;
tonic::PackagesMap packages_map_;
DISALLOW_COPY_AND_ASSIGN(DartLibraryProviderFiles);
};
......
......@@ -32,7 +32,7 @@ NSURL* URLForSwitch(const char* name) {
FlutterDartProject* project = [[FlutterDartProject alloc]
initWithFLXArchive:URLForSwitch(sky::shell::switches::kFLX)
dartMain:URLForSwitch(sky::shell::switches::kMainDartFile)
packageRoot:URLForSwitch(sky::shell::switches::kPackageRoot)];
packages:URLForSwitch(sky::shell::switches::kPackages)];
#else
NSString* bundlePath =
[[NSBundle mainBundle] pathForResource:@"FlutterApplication"
......
......@@ -15,7 +15,7 @@
#pragma mark - Override base class designated initializers
- (instancetype)init {
return [self initWithFLXArchive:nil dartMain:nil packageRoot:nil];
return [self initWithFLXArchive:nil dartMain:nil packages:nil];
}
#pragma mark - Designated initializers
......@@ -34,12 +34,12 @@
- (instancetype)initWithFLXArchive:(NSURL*)archiveURL
dartMain:(NSURL*)dartMainURL
packageRoot:(NSURL*)dartPackageURL {
packages:(NSURL*)dartPackages {
self = [super init];
if (self) {
_dartSource = [[FlutterDartSource alloc] initWithDartMain:dartMainURL
packageRoot:dartPackageURL
packages:dartPackages
flxArchive:archiveURL];
[self checkReadiness];
......@@ -160,7 +160,7 @@ static NSString* NSStringFromVMType(VMType type) {
}
engine->RunFromFile(_dartSource.dartMain.absoluteURL.path.UTF8String,
_dartSource.packageRoot.absoluteURL.path.UTF8String,
_dartSource.packages.absoluteURL.path.UTF8String,
_dartSource.flxArchive.absoluteURL.path.UTF8String);
result(YES, @"Success");
}];
......
......@@ -12,11 +12,11 @@ typedef void (^ValidationResult)(BOOL result, NSString* message);
@interface FlutterDartSource : NSObject
@property(nonatomic, readonly) NSURL* dartMain;
@property(nonatomic, readonly) NSURL* packageRoot;
@property(nonatomic, readonly) NSURL* packages;
@property(nonatomic, readonly) NSURL* flxArchive;
- (instancetype)initWithDartMain:(NSURL*)dartMain
packageRoot:(NSURL*)packageRoot
packages:(NSURL*)packages
flxArchive:(NSURL*)flxArchive NS_DESIGNATED_INITIALIZER;
- (void)validate:(ValidationResult)result;
......
......@@ -6,22 +6,22 @@
@implementation FlutterDartSource {
NSURL* _dartMain;
NSURL* _packageRoot;
NSURL* _packages;
NSURL* _flxArchive;
}
- (instancetype)init {
return [self initWithDartMain:nil packageRoot:nil flxArchive:nil];
return [self initWithDartMain:nil packages:nil flxArchive:nil];
}
- (instancetype)initWithDartMain:(NSURL*)dartMain
packageRoot:(NSURL*)packageRoot
packages:(NSURL*)packages
flxArchive:(NSURL*)flxArchive {
self = [super init];
if (self) {
_dartMain = [dartMain copy];
_packageRoot = [packageRoot copy];
_packages = [packages copy];
_flxArchive = [flxArchive copy];
}
......@@ -57,14 +57,14 @@ static BOOL CheckDartProjectURL(NSMutableString* log,
isValid &= CheckDartProjectURL(log, _flxArchive, @"FLX archive");
isValid &= CheckDartProjectURL(log, _dartMain, @"Dart main");
isValid &= CheckDartProjectURL(log, _packageRoot, @"Dart package root");
isValid &= CheckDartProjectURL(log, _packages, @"Dart packages");
result(isValid, log);
}
- (void)dealloc {
[_dartMain release];
[_packageRoot release];
[_packages release];
[_flxArchive release];
[super dealloc];
......
......@@ -17,7 +17,7 @@ FLUTTER_EXPORT
- (instancetype)initWithFLXArchive:(NSURL*)archiveURL
dartMain:(NSURL*)dartMainURL
packageRoot:(NSURL*)dartPackageURL
packages:(NSURL*)dartPackages
NS_DESIGNATED_INITIALIZER;
@end
......
......@@ -103,9 +103,9 @@ void PlatformMacMain(int argc, const char* argv[], std::string icu_data_path) {
}
static bool FlagsValidForCommandLineLaunch(const std::string& dart_main,
const std::string& package_root,
const std::string& packages,
const std::string& bundle) {
if (dart_main.size() == 0 || package_root.size() == 0 || bundle.size() == 0) {
if (dart_main.empty() || packages.empty() || bundle.empty()) {
return false;
}
......@@ -119,7 +119,7 @@ static bool FlagsValidForCommandLineLaunch(const std::string& dart_main,
return false;
}
if (![manager fileExistsAtPath:@(package_root.c_str())]) {
if (![manager fileExistsAtPath:@(packages.c_str())]) {
return false;
}
......@@ -157,23 +157,23 @@ bool AttemptLaunchFromCommandLineSwitches(sky::SkyEnginePtr& engine) {
auto command_line = *base::CommandLine::ForCurrentProcess();
if (command_line.HasSwitch(kMainDartFile) ||
command_line.HasSwitch(kPackageRoot) || command_line.HasSwitch(kFLX)) {
command_line.HasSwitch(kPackages) || command_line.HasSwitch(kFLX)) {
// The main dart file, flx bundle and the package root must be specified in
// one go. We dont want to end up in a situation where we take one value
// from the command line and the others from user defaults. In case, any
// new flags are specified, forget about all the old ones.
[defaults removeObjectForKey:@(kMainDartFile)];
[defaults removeObjectForKey:@(kPackageRoot)];
[defaults removeObjectForKey:@(kPackages)];
[defaults removeObjectForKey:@(kFLX)];
[defaults synchronize];
}
std::string dart_main = ResolveCommandLineLaunchFlag(kMainDartFile);
std::string package_root = ResolveCommandLineLaunchFlag(kPackageRoot);
std::string packages = ResolveCommandLineLaunchFlag(kPackages);
std::string bundle = ResolveCommandLineLaunchFlag(kFLX);
if (!FlagsValidForCommandLineLaunch(dart_main, package_root, bundle)) {
if (!FlagsValidForCommandLineLaunch(dart_main, packages, bundle)) {
return false;
}
......@@ -181,13 +181,13 @@ bool AttemptLaunchFromCommandLineSwitches(sky::SkyEnginePtr& engine) {
// defaults so that the next time the user launches the application in the
// simulator without the tooling, the application boots up.
[defaults setObject:@(dart_main.c_str()) forKey:@(kMainDartFile)];
[defaults setObject:@(package_root.c_str()) forKey:@(kPackageRoot)];
[defaults setObject:@(packages.c_str()) forKey:@(kPackages)];
[defaults setObject:@(bundle.c_str()) forKey:@(kFLX)];
[defaults synchronize];
// Finally launch with the newly resolved arguments.
engine->RunFromFile(dart_main, package_root, bundle);
engine->RunFromFile(dart_main, packages, bundle);
return true;
}
......
......@@ -109,9 +109,9 @@ static inline pointer::PointerType EventTypeFromNSEventPhase(
auto args = command_line.GetArgs();
if (args.size() > 0) {
auto package_root =
command_line.GetSwitchValueASCII(sky::shell::switches::kPackageRoot);
_sky_engine->RunFromFile(args[0], package_root, "");
auto packages =
command_line.GetSwitchValueASCII(sky::shell::switches::kPackages);
_sky_engine->RunFromFile(args[0], packages, "");
return;
}
}
......
......@@ -15,7 +15,7 @@ const char kFLX[] = "flx";
const char kHelp[] = "help";
const char kNonInteractive[] = "non-interactive";
const char kMainDartFile[] = "dart-main";
const char kPackageRoot[] = "package-root";
const char kPackages[] = "packages";
const char kStartPaused[] = "start-paused";
const char kTraceStartup[] = "trace-startup";
const char kDeviceObservatoryPort[] = "observatory-port";
......@@ -27,7 +27,7 @@ void PrintUsage(const std::string& executable_name) {
<< " --" << kStartPaused
<< " --" << kTraceStartup
<< " --" << kFLX << "=FLX"
<< " --" << kPackageRoot << "=PACKAGE_ROOT"
<< " --" << kPackages << "=PACKAGES"
<< " --" << kDeviceObservatoryPort << "=8181"
<< " [ MAIN_DART ]" << std::endl;
}
......
......@@ -16,7 +16,7 @@ extern const char kFLX[];
extern const char kHelp[];
extern const char kNonInteractive[];
extern const char kMainDartFile[];
extern const char kPackageRoot[];
extern const char kPackages[];
extern const char kStartPaused[];
extern const char kTraceStartup[];
extern const char kDeviceObservatoryPort[];
......
......@@ -41,7 +41,7 @@ TestRunner& TestRunner::Shared() {
}
void TestRunner::Run(const TestDescriptor& test) {
sky_engine_->RunFromFile(test.path, test.package_root, "");
sky_engine_->RunFromFile(test.path, test.packages, "");
}
} // namespace shell
......
......@@ -24,7 +24,7 @@ class TestRunner {
struct TestDescriptor {
std::string path;
std::string package_root;
std::string packages;
};
void Run(const TestDescriptor& test);
......
......@@ -15,7 +15,7 @@ bool InitForTesting() {
base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess();
TestRunner::TestDescriptor test;
test.package_root = command_line.GetSwitchValueASCII(switches::kPackageRoot);
test.packages = command_line.GetSwitchValueASCII(switches::kPackages);
auto args = command_line.GetArgs();
if (args.empty())
return false;
......
......@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/threading/worker_pool.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
......@@ -209,17 +210,31 @@ void Engine::RunFromPrecompiledSnapshot(const mojo::String& bundle_path) {
}
void Engine::RunFromFile(const mojo::String& main,
const mojo::String& package_root,
const mojo::String& packages,
const mojo::String& bundle) {
TRACE_EVENT0("flutter", "Engine::RunFromFile");
std::string main_str(main);
if (bundle.size() != 0) {
// The specification of an FLX bundle is optional.
ConfigureZipAssetBundle(bundle);
}
std::string package_root_str = package_root;
dart_library_provider_.reset(
new DartLibraryProviderFiles(base::FilePath(package_root_str)));
RunFromLibrary(main);
base::FilePath packages_path = base::FilePath(std::string(packages));
if (packages_path.empty()) {
base::FilePath main_dir = base::FilePath(main_str).DirName();
packages_path = main_dir.Append(FILE_PATH_LITERAL(".packages"));
if (!base::PathExists(packages_path)) {
packages_path = main_dir
.Append(base::FilePath::kParentDirectory)
.Append(FILE_PATH_LITERAL(".packages"));
if (!base::PathExists(packages_path))
packages_path = base::FilePath();
}
}
DartLibraryProviderFiles* provider = new DartLibraryProviderFiles();
dart_library_provider_.reset(provider);
if (!packages_path.empty())
provider->LoadPackagesMap(packages_path);
RunFromLibrary(main_str);
}
void Engine::RunFromBundle(const mojo::String& script_uri,
......
......@@ -71,7 +71,7 @@ class Engine : public UIDelegate,
void OnPointerPacket(pointer::PointerPacketPtr packet) override;
void RunFromFile(const mojo::String& main,
const mojo::String& package_root,
const mojo::String& packages,
const mojo::String& bundle) override;
void RunFromPrecompiledSnapshot(const mojo::String& bundle_path) override;
void RunFromBundle(const mojo::String& script_uri,
......
......@@ -69,16 +69,16 @@ void Loader::LoadPackagesMap(const base::FilePath& packages) {
packages_ = base::MakeAbsoluteFilePath(packages);
dependencies_.insert(packages_.AsUTF8Unsafe());
std::string packages_source;
if (!base::ReadFileToString(packages, &packages_source)) {
if (!base::ReadFileToString(packages_, &packages_source)) {
fprintf(stderr, "error: Unable to load .packages file '%s'.\n",
packages.AsUTF8Unsafe().c_str());
packages_.AsUTF8Unsafe().c_str());
exit(1);
}
packages_map_.reset(new tonic::PackagesMap());
std::string error;
if (!packages_map_->Parse(packages_source, &error)) {
fprintf(stderr, "error: Unable to parse .packages file '%s'.\n%s\n",
packages.AsUTF8Unsafe().c_str(), error.c_str());
packages_.AsUTF8Unsafe().c_str(), error.c_str());
exit(1);
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册