Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
c5999c74
Commit
c5999c74
authored
Jun 26, 2017
by
Mikkel Nygaard Ravn
Committed by
GitHub
Jun 26, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add gradle wrapper to project template (#10928)
parent
d97b13b5
Changes
15
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
216 additions
and
106 deletions
+216
-106
gradle_wrapper.version
bin/internal/gradle_wrapper.version
+1
-0
file_system.dart
packages/flutter_tools/lib/src/base/file_system.dart
+4
-2
os.dart
packages/flutter_tools/lib/src/base/os.dart
+19
-0
cache.dart
packages/flutter_tools/lib/src/cache.dart
+123
-79
create.dart
packages/flutter_tools/lib/src/commands/create.dart
+21
-0
services.dart
packages/flutter_tools/lib/src/services.dart
+3
-5
build.gradle
...ter_tools/templates/create/android-java.tmpl/build.gradle
+1
-5
build.gradle
...r_tools/templates/create/android-kotlin.tmpl/build.gradle
+1
-5
.gitignore
...es/flutter_tools/templates/create/android.tmpl/.gitignore
+0
-4
gradle-wrapper.properties
...ate/android.tmpl/gradle/wrapper/gradle-wrapper.properties
+6
-0
build.gradle.tmpl
...ools/templates/plugin/android-java.tmpl/build.gradle.tmpl
+1
-1
build.gradle.tmpl
...ls/templates/plugin/android-kotlin.tmpl/build.gradle.tmpl
+1
-1
.gitignore
...es/flutter_tools/templates/plugin/android.tmpl/.gitignore
+0
-4
gradle-wrapper.properties
...gin/android.tmpl/gradle/wrapper/gradle-wrapper.properties
+6
-0
cache_test.dart
packages/flutter_tools/test/cache_test.dart
+29
-0
No files found.
bin/internal/gradle_wrapper.version
0 → 100644
View file @
c5999c74
0b5c1398d1d04ac245a310de98825cb7b3278e2a
packages/flutter_tools/lib/src/base/file_system.dart
View file @
c5999c74
...
@@ -71,10 +71,11 @@ void ensureDirectoryExists(String filePath) {
...
@@ -71,10 +71,11 @@ void ensureDirectoryExists(String filePath) {
}
}
}
}
/// Recursively copies `srcDir` to `destDir`.
/// Recursively copies `srcDir` to `destDir`, invoking [onFileCopied] if
/// specified for each source/destination file pair.
///
///
/// Creates `destDir` if needed.
/// Creates `destDir` if needed.
void
copyDirectorySync
(
Directory
srcDir
,
Directory
destDir
)
{
void
copyDirectorySync
(
Directory
srcDir
,
Directory
destDir
,
[
void
onFileCopied
(
File
srcFile
,
File
destFile
)]
)
{
if
(!
srcDir
.
existsSync
())
if
(!
srcDir
.
existsSync
())
throw
new
Exception
(
'Source directory "
${srcDir.path}
" does not exist, nothing to copy'
);
throw
new
Exception
(
'Source directory "
${srcDir.path}
" does not exist, nothing to copy'
);
...
@@ -86,6 +87,7 @@ void copyDirectorySync(Directory srcDir, Directory destDir) {
...
@@ -86,6 +87,7 @@ void copyDirectorySync(Directory srcDir, Directory destDir) {
if
(
entity
is
File
)
{
if
(
entity
is
File
)
{
final
File
newFile
=
destDir
.
fileSystem
.
file
(
newPath
);
final
File
newFile
=
destDir
.
fileSystem
.
file
(
newPath
);
newFile
.
writeAsBytesSync
(
entity
.
readAsBytesSync
());
newFile
.
writeAsBytesSync
(
entity
.
readAsBytesSync
());
onFileCopied
?.
call
(
entity
,
newFile
);
}
else
if
(
entity
is
Directory
)
{
}
else
if
(
entity
is
Directory
)
{
copyDirectorySync
(
copyDirectorySync
(
entity
,
destDir
.
fileSystem
.
directory
(
newPath
));
entity
,
destDir
.
fileSystem
.
directory
(
newPath
));
...
...
packages/flutter_tools/lib/src/base/os.dart
View file @
c5999c74
...
@@ -47,6 +47,8 @@ abstract class OperatingSystemUtils {
...
@@ -47,6 +47,8 @@ abstract class OperatingSystemUtils {
void
unzip
(
File
file
,
Directory
targetDirectory
);
void
unzip
(
File
file
,
Directory
targetDirectory
);
void
unpack
(
File
gzippedTarFile
,
Directory
targetDirectory
);
/// Returns a pretty name string for the current operating system.
/// Returns a pretty name string for the current operating system.
///
///
/// If available, the detailed version of the OS is included.
/// If available, the detailed version of the OS is included.
...
@@ -97,6 +99,12 @@ class _PosixUtils extends OperatingSystemUtils {
...
@@ -97,6 +99,12 @@ class _PosixUtils extends OperatingSystemUtils {
runSync
(<
String
>[
'unzip'
,
'-o'
,
'-q'
,
file
.
path
,
'-d'
,
targetDirectory
.
path
]);
runSync
(<
String
>[
'unzip'
,
'-o'
,
'-q'
,
file
.
path
,
'-d'
,
targetDirectory
.
path
]);
}
}
// tar -xzf tarball -C dest
@override
void
unpack
(
File
gzippedTarFile
,
Directory
targetDirectory
)
{
runSync
(<
String
>[
'tar'
,
'-xzf'
,
gzippedTarFile
.
path
,
'-C'
,
targetDirectory
.
path
]);
}
@override
@override
File
makePipe
(
String
path
)
{
File
makePipe
(
String
path
)
{
runSync
(<
String
>[
'mkfifo'
,
path
]);
runSync
(<
String
>[
'mkfifo'
,
path
]);
...
@@ -167,7 +175,18 @@ class _WindowsUtils extends OperatingSystemUtils {
...
@@ -167,7 +175,18 @@ class _WindowsUtils extends OperatingSystemUtils {
@override
@override
void
unzip
(
File
file
,
Directory
targetDirectory
)
{
void
unzip
(
File
file
,
Directory
targetDirectory
)
{
final
Archive
archive
=
new
ZipDecoder
().
decodeBytes
(
file
.
readAsBytesSync
());
final
Archive
archive
=
new
ZipDecoder
().
decodeBytes
(
file
.
readAsBytesSync
());
_unpackArchive
(
archive
,
targetDirectory
);
}
@override
void
unpack
(
File
gzippedTarFile
,
Directory
targetDirectory
)
{
final
Archive
archive
=
new
TarDecoder
().
decodeBytes
(
new
GZipDecoder
().
decodeBytes
(
gzippedTarFile
.
readAsBytesSync
()),
);
_unpackArchive
(
archive
,
targetDirectory
);
}
void
_unpackArchive
(
Archive
archive
,
Directory
targetDirectory
)
{
for
(
ArchiveFile
archiveFile
in
archive
.
files
)
{
for
(
ArchiveFile
archiveFile
in
archive
.
files
)
{
// The archive package doesn't correctly set isFile.
// The archive package doesn't correctly set isFile.
if
(!
archiveFile
.
isFile
||
archiveFile
.
name
.
endsWith
(
'/'
))
if
(!
archiveFile
.
isFile
||
archiveFile
.
name
.
endsWith
(
'/'
))
...
...
packages/flutter_tools/lib/src/cache.dart
View file @
c5999c74
...
@@ -17,9 +17,19 @@ import 'globals.dart';
...
@@ -17,9 +17,19 @@ import 'globals.dart';
/// A wrapper around the `bin/cache/` directory.
/// A wrapper around the `bin/cache/` directory.
class
Cache
{
class
Cache
{
/// [rootOverride] is configurable for testing.
/// [rootOverride] is configurable for testing.
Cache
({
Directory
rootOverride
})
:
_rootOverride
=
rootOverride
;
/// [artifacts] is configurable for testing.
Cache
({
Directory
rootOverride
,
List
<
CachedArtifact
>
artifacts
})
:
_rootOverride
=
rootOverride
{
if
(
artifacts
==
null
)
{
_artifacts
.
add
(
new
MaterialFonts
(
this
));
_artifacts
.
add
(
new
FlutterEngine
(
this
));
_artifacts
.
add
(
new
GradleWrapper
(
this
));
}
else
{
_artifacts
.
addAll
(
artifacts
);
}
}
final
Directory
_rootOverride
;
final
Directory
_rootOverride
;
final
List
<
CachedArtifact
>
_artifacts
=
<
CachedArtifact
>[];
// Initialized by FlutterCommandRunner on startup.
// Initialized by FlutterCommandRunner on startup.
static
String
flutterRoot
;
static
String
flutterRoot
;
...
@@ -155,16 +165,9 @@ class Cache {
...
@@ -155,16 +165,9 @@ class Cache {
return
fs
.
file
(
fs
.
path
.
join
(
getRoot
().
path
,
'
$artifactName
.stamp'
));
return
fs
.
file
(
fs
.
path
.
join
(
getRoot
().
path
,
'
$artifactName
.stamp'
));
}
}
bool
isUpToDate
()
{
bool
isUpToDate
()
=>
_artifacts
.
every
((
CachedArtifact
artifact
)
=>
artifact
.
isUpToDate
());
final
MaterialFonts
materialFonts
=
new
MaterialFonts
(
cache
);
final
FlutterEngine
engine
=
new
FlutterEngine
(
cache
);
return
materialFonts
.
isUpToDate
()
&&
engine
.
isUpToDate
();
Future
<
String
>
getThirdPartyFile
(
String
urlStr
,
String
serviceName
)
async
{
}
Future
<
String
>
getThirdPartyFile
(
String
urlStr
,
String
serviceName
,
{
bool
unzip:
false
})
async
{
final
Uri
url
=
Uri
.
parse
(
urlStr
);
final
Uri
url
=
Uri
.
parse
(
urlStr
);
final
Directory
thirdPartyDir
=
getArtifactDirectory
(
'third_party'
);
final
Directory
thirdPartyDir
=
getArtifactDirectory
(
'third_party'
);
...
@@ -175,7 +178,7 @@ class Cache {
...
@@ -175,7 +178,7 @@ class Cache {
final
File
cachedFile
=
fs
.
file
(
fs
.
path
.
join
(
serviceDir
.
path
,
url
.
pathSegments
.
last
));
final
File
cachedFile
=
fs
.
file
(
fs
.
path
.
join
(
serviceDir
.
path
,
url
.
pathSegments
.
last
));
if
(!
cachedFile
.
existsSync
())
{
if
(!
cachedFile
.
existsSync
())
{
try
{
try
{
await
_downloadFile
ToCache
(
url
,
cachedFile
,
unzip
);
await
_downloadFile
(
url
,
cachedFile
);
}
catch
(
e
)
{
}
catch
(
e
)
{
printError
(
'Failed to fetch third-party artifact
$url
:
$e
'
);
printError
(
'Failed to fetch third-party artifact
$url
:
$e
'
);
rethrow
;
rethrow
;
...
@@ -188,77 +191,65 @@ class Cache {
...
@@ -188,77 +191,65 @@ class Cache {
Future
<
Null
>
updateAll
()
async
{
Future
<
Null
>
updateAll
()
async
{
if
(!
_lockEnabled
)
if
(!
_lockEnabled
)
return
null
;
return
null
;
final
MaterialFonts
materialFonts
=
new
MaterialFonts
(
cache
);
for
(
CachedArtifact
artifact
in
_artifacts
)
{
if
(!
materialFonts
.
isUpToDate
())
if
(!
artifact
.
isUpToDate
())
await
materialFonts
.
download
();
await
artifact
.
update
();
final
FlutterEngine
engine
=
new
FlutterEngine
(
cache
);
if
(!
engine
.
isUpToDate
())
await
engine
.
download
();
}
/// Download a file from the given url and write it to the cache.
/// If [unzip] is true, treat the url as a zip file, and unzip it to the
/// directory given.
static
Future
<
Null
>
_downloadFileToCache
(
Uri
url
,
FileSystemEntity
location
,
bool
unzip
)
async
{
if
(!
location
.
parent
.
existsSync
())
location
.
parent
.
createSync
(
recursive:
true
);
final
List
<
int
>
fileBytes
=
await
fetchUrl
(
url
);
if
(
unzip
)
{
if
(
location
is
Directory
&&
!
location
.
existsSync
())
location
.
createSync
(
recursive:
true
);
final
File
tempFile
=
fs
.
file
(
fs
.
path
.
join
(
fs
.
systemTempDirectory
.
path
,
'
${url.toString().hashCode}
.zip'
));
tempFile
.
writeAsBytesSync
(
fileBytes
,
flush:
true
);
os
.
unzip
(
tempFile
,
location
);
tempFile
.
deleteSync
();
}
else
{
final
File
file
=
location
;
file
.
writeAsBytesSync
(
fileBytes
,
flush:
true
);
}
}
}
}
}
}
class
MaterialFonts
{
/// An artifact managed by the cache.
MaterialFonts
(
this
.
cache
);
abstract
class
CachedArtifact
{
CachedArtifact
(
this
.
name
,
this
.
cache
);
static
const
String
kName
=
'material_fonts'
;
final
String
name
;
final
Cache
cache
;
final
Cache
cache
;
Directory
get
location
=>
cache
.
getArtifactDirectory
(
name
);
String
get
version
=>
cache
.
getVersionFor
(
name
);
bool
isUpToDate
()
{
bool
isUpToDate
()
{
if
(!
cache
.
getArtifactDirectory
(
kName
)
.
existsSync
())
if
(!
location
.
existsSync
())
return
false
;
return
false
;
return
cache
.
getVersionFor
(
kName
)
==
cache
.
getStampFor
(
kName
);
if
(
version
!=
cache
.
getStampFor
(
name
))
return
false
;
return
isUpToDateInner
();
}
}
Future
<
Null
>
download
()
{
Future
<
Null
>
update
()
async
{
final
Status
status
=
logger
.
startProgress
(
'Downloading Material fonts...'
,
expectSlowOperation:
true
);
if
(
location
.
existsSync
())
location
.
deleteSync
(
recursive:
true
);
location
.
createSync
(
recursive:
true
);
return
updateInner
().
then
<
Null
>((
_
)
{
cache
.
setStampFor
(
name
,
version
);
});
}
/// Hook method for extra checks for being up-to-date.
bool
isUpToDateInner
()
=>
true
;
/// Template method to perform artifact update.
Future
<
Null
>
updateInner
();
}
final
Directory
fontsDir
=
cache
.
getArtifactDirectory
(
kName
);
/// A cached artifact containing fonts used for Material Design.
if
(
fontsDir
.
existsSync
())
class
MaterialFonts
extends
CachedArtifact
{
fontsDir
.
deleteSync
(
recursive:
tru
e
);
MaterialFonts
(
Cache
cache
):
super
(
'material_fonts'
,
cach
e
);
return
Cache
.
_downloadFileToCache
(
@override
Uri
.
parse
(
cache
.
getVersionFor
(
kName
)),
fontsDir
,
true
Future
<
Null
>
updateInner
()
{
).
then
<
Null
>((
Null
value
)
{
final
Status
status
=
logger
.
startProgress
(
'Downloading Material fonts...'
,
expectSlowOperation:
true
);
cache
.
setStampFor
(
kName
,
cache
.
getVersionFor
(
kName
));
return
_downloadZipArchive
(
Uri
.
parse
(
version
),
location
).
then
<
Null
>((
_
)
{
status
.
stop
();
status
.
stop
();
}).
whenComplete
(
status
.
cancel
);
}).
whenComplete
(
status
.
cancel
);
}
}
}
}
class
FlutterEngine
{
/// A cached artifact containing the Flutter engine binaries.
class
FlutterEngine
extends
CachedArtifact
{
FlutterEngine
(
this
.
cache
);
FlutterEngine
(
Cache
cache
):
super
(
'engine'
,
cache
);
static
const
String
kName
=
'engine'
;
List
<
String
>
_getPackageDirs
()
=>
const
<
String
>[
'sky_engine'
];
static
const
String
kSkyEngine
=
'sky_engine'
;
final
Cache
cache
;
List
<
String
>
_getPackageDirs
()
=>
const
<
String
>[
kSkyEngine
];
// Return a list of (cache directory path, download URL path) tuples.
// Return a list of (cache directory path, download URL path) tuples.
List
<
List
<
String
>>
_getBinaryDirs
()
{
List
<
List
<
String
>>
_getBinaryDirs
()
{
...
@@ -320,7 +311,8 @@ class FlutterEngine {
...
@@ -320,7 +311,8 @@ class FlutterEngine {
<
String
>[
'ios-release'
,
'ios-release/artifacts.zip'
],
<
String
>[
'ios-release'
,
'ios-release/artifacts.zip'
],
];
];
bool
isUpToDate
()
{
@override
bool
isUpToDateInner
()
{
final
Directory
pkgDir
=
cache
.
getCacheDir
(
'pkg'
);
final
Directory
pkgDir
=
cache
.
getCacheDir
(
'pkg'
);
for
(
String
pkgName
in
_getPackageDirs
())
{
for
(
String
pkgName
in
_getPackageDirs
())
{
final
String
pkgPath
=
fs
.
path
.
join
(
pkgDir
.
path
,
pkgName
);
final
String
pkgPath
=
fs
.
path
.
join
(
pkgDir
.
path
,
pkgName
);
...
@@ -328,19 +320,17 @@ class FlutterEngine {
...
@@ -328,19 +320,17 @@ class FlutterEngine {
return
false
;
return
false
;
}
}
final
Directory
engineDir
=
cache
.
getArtifactDirectory
(
kName
);
for
(
List
<
String
>
toolsDir
in
_getBinaryDirs
())
{
for
(
List
<
String
>
toolsDir
in
_getBinaryDirs
())
{
final
Directory
dir
=
fs
.
directory
(
fs
.
path
.
join
(
engineDir
.
path
,
toolsDir
[
0
]));
final
Directory
dir
=
fs
.
directory
(
fs
.
path
.
join
(
location
.
path
,
toolsDir
[
0
]));
if
(!
dir
.
existsSync
())
if
(!
dir
.
existsSync
())
return
false
;
return
false
;
}
}
return
true
;
return
cache
.
getVersionFor
(
kName
)
==
cache
.
getStampFor
(
kName
);
}
}
Future
<
Null
>
download
()
async
{
@override
final
String
engineVersion
=
cache
.
getVersionFor
(
kName
);
Future
<
Null
>
updateInner
()
async
{
final
String
url
=
'https://storage.googleapis.com/flutter_infra/flutter/
$
engineV
ersion
/'
;
final
String
url
=
'https://storage.googleapis.com/flutter_infra/flutter/
$
v
ersion
/'
;
final
Directory
pkgDir
=
cache
.
getCacheDir
(
'pkg'
);
final
Directory
pkgDir
=
cache
.
getCacheDir
(
'pkg'
);
for
(
String
pkgName
in
_getPackageDirs
())
{
for
(
String
pkgName
in
_getPackageDirs
())
{
...
@@ -351,14 +341,10 @@ class FlutterEngine {
...
@@ -351,14 +341,10 @@ class FlutterEngine {
await
_downloadItem
(
'Downloading package
$pkgName
...'
,
url
+
pkgName
+
'.zip'
,
pkgDir
);
await
_downloadItem
(
'Downloading package
$pkgName
...'
,
url
+
pkgName
+
'.zip'
,
pkgDir
);
}
}
final
Directory
engineDir
=
cache
.
getArtifactDirectory
(
kName
);
if
(
engineDir
.
existsSync
())
engineDir
.
deleteSync
(
recursive:
true
);
for
(
List
<
String
>
toolsDir
in
_getBinaryDirs
())
{
for
(
List
<
String
>
toolsDir
in
_getBinaryDirs
())
{
final
String
cacheDir
=
toolsDir
[
0
];
final
String
cacheDir
=
toolsDir
[
0
];
final
String
urlPath
=
toolsDir
[
1
];
final
String
urlPath
=
toolsDir
[
1
];
final
Directory
dir
=
fs
.
directory
(
fs
.
path
.
join
(
engineDir
.
path
,
cacheDir
));
final
Directory
dir
=
fs
.
directory
(
fs
.
path
.
join
(
location
.
path
,
cacheDir
));
await
_downloadItem
(
'Downloading
$cacheDir
tools...'
,
url
+
urlPath
,
dir
);
await
_downloadItem
(
'Downloading
$cacheDir
tools...'
,
url
+
urlPath
,
dir
);
_makeFilesExecutable
(
dir
);
_makeFilesExecutable
(
dir
);
...
@@ -370,8 +356,6 @@ class FlutterEngine {
...
@@ -370,8 +356,6 @@ class FlutterEngine {
os
.
unzip
(
frameworkZip
,
framework
);
os
.
unzip
(
frameworkZip
,
framework
);
}
}
}
}
cache
.
setStampFor
(
kName
,
cache
.
getVersionFor
(
kName
));
}
}
void
_makeFilesExecutable
(
Directory
dir
)
{
void
_makeFilesExecutable
(
Directory
dir
)
{
...
@@ -386,8 +370,68 @@ class FlutterEngine {
...
@@ -386,8 +370,68 @@ class FlutterEngine {
Future
<
Null
>
_downloadItem
(
String
message
,
String
url
,
Directory
dest
)
{
Future
<
Null
>
_downloadItem
(
String
message
,
String
url
,
Directory
dest
)
{
final
Status
status
=
logger
.
startProgress
(
message
,
expectSlowOperation:
true
);
final
Status
status
=
logger
.
startProgress
(
message
,
expectSlowOperation:
true
);
return
Cache
.
_downloadFileToCache
(
Uri
.
parse
(
url
),
dest
,
true
).
then
<
Null
>((
Null
value
)
{
return
_downloadZipArchive
(
Uri
.
parse
(
url
),
dest
).
then
<
Null
>((
_
)
{
status
.
stop
();
}).
whenComplete
(
status
.
cancel
);
}
}
/// A cached artifact containing Gradle Wrapper scripts and binaries.
class
GradleWrapper
extends
CachedArtifact
{
GradleWrapper
(
Cache
cache
):
super
(
'gradle_wrapper'
,
cache
);
@override
Future
<
Null
>
updateInner
()
async
{
final
Status
status
=
logger
.
startProgress
(
'Downloading Gradle Wrapper...'
,
expectSlowOperation:
true
);
final
String
url
=
'https://android.googlesource.com'
'/platform/tools/base/+archive/
$version
/templates/gradle/wrapper.tgz'
;
await
_downloadZippedTarball
(
Uri
.
parse
(
url
),
location
).
then
<
Null
>((
_
)
{
// Delete property file, allowing templates to provide it.
fs
.
file
(
fs
.
path
.
join
(
location
.
path
,
'gradle'
,
'wrapper'
,
'gradle-wrapper.properties'
)).
deleteSync
();
status
.
stop
();
status
.
stop
();
}).
whenComplete
(
status
.
cancel
);
}).
whenComplete
(
status
.
cancel
);
}
}
}
}
/// Download a file from the given [url] and write it to [location].
Future
<
Null
>
_downloadFile
(
Uri
url
,
File
location
)
async
{
_ensureExists
(
location
.
parent
);
final
List
<
int
>
fileBytes
=
await
fetchUrl
(
url
);
location
.
writeAsBytesSync
(
fileBytes
,
flush:
true
);
}
/// Download a zip archive from the given [url] and unzip it to [location].
Future
<
Null
>
_downloadZipArchive
(
Uri
url
,
Directory
location
)
{
return
_withTemporaryFile
(
'download.zip'
,
(
File
tempFile
)
async
{
await
_downloadFile
(
url
,
tempFile
);
_ensureExists
(
location
);
os
.
unzip
(
tempFile
,
location
);
});
}
/// Download a gzipped tarball from the given [url] and unpack it to [location].
Future
<
Null
>
_downloadZippedTarball
(
Uri
url
,
Directory
location
)
{
return
_withTemporaryFile
(
'download.tgz'
,
(
File
tempFile
)
async
{
await
_downloadFile
(
url
,
tempFile
);
_ensureExists
(
location
);
os
.
unpack
(
tempFile
,
location
);
});
}
/// Create a file with the given name in a new temporary directory, invoke
/// [onTemporaryFile] with the file as argument, then delete the temporary
/// directory.
Future
<
Null
>
_withTemporaryFile
(
String
name
,
Future
<
Null
>
onTemporaryFile
(
File
file
))
async
{
final
Directory
tempDir
=
fs
.
systemTempDirectory
.
createTempSync
();
final
File
tempFile
=
fs
.
file
(
fs
.
path
.
join
(
tempDir
.
path
,
name
));
await
onTemporaryFile
(
tempFile
).
whenComplete
(()
{
tempDir
.
delete
(
recursive:
true
);
});
}
/// Create the given [directory] and parents, as necessary.
void
_ensureExists
(
Directory
directory
)
{
if
(!
directory
.
existsSync
())
directory
.
createSync
(
recursive:
true
);
}
packages/flutter_tools/lib/src/commands/create.dart
View file @
c5999c74
...
@@ -11,6 +11,7 @@ import '../android/android_sdk.dart' as android_sdk;
...
@@ -11,6 +11,7 @@ import '../android/android_sdk.dart' as android_sdk;
import
'../android/gradle.dart'
as
gradle
;
import
'../android/gradle.dart'
as
gradle
;
import
'../base/common.dart'
;
import
'../base/common.dart'
;
import
'../base/file_system.dart'
;
import
'../base/file_system.dart'
;
import
'../base/os.dart'
;
import
'../base/utils.dart'
;
import
'../base/utils.dart'
;
import
'../build_info.dart'
;
import
'../build_info.dart'
;
import
'../cache.dart'
;
import
'../cache.dart'
;
...
@@ -167,6 +168,10 @@ class CreateCommand extends FlutterCommand {
...
@@ -167,6 +168,10 @@ class CreateCommand extends FlutterCommand {
}
}
generatedCount
+=
_renderTemplate
(
'create'
,
appPath
,
templateContext
);
generatedCount
+=
_renderTemplate
(
'create'
,
appPath
,
templateContext
);
generatedCount
+=
_injectGradleWrapper
(
appPath
);
if
(
appPath
!=
dirPath
)
{
generatedCount
+=
_injectGradleWrapper
(
dirPath
);
}
if
(
argResults
[
'with-driver-test'
])
{
if
(
argResults
[
'with-driver-test'
])
{
final
String
testPath
=
fs
.
path
.
join
(
appPath
,
'test_driver'
);
final
String
testPath
=
fs
.
path
.
join
(
appPath
,
'test_driver'
);
generatedCount
+=
_renderTemplate
(
'driver'
,
testPath
,
templateContext
);
generatedCount
+=
_renderTemplate
(
'driver'
,
testPath
,
templateContext
);
...
@@ -272,6 +277,22 @@ To edit platform code in an IDE see https://flutter.io/platform-plugins/#edit-co
...
@@ -272,6 +277,22 @@ To edit platform code in an IDE see https://flutter.io/platform-plugins/#edit-co
final
Template
template
=
new
Template
.
fromName
(
templateName
);
final
Template
template
=
new
Template
.
fromName
(
templateName
);
return
template
.
render
(
fs
.
directory
(
dirPath
),
context
,
overwriteExisting:
false
);
return
template
.
render
(
fs
.
directory
(
dirPath
),
context
,
overwriteExisting:
false
);
}
}
int
_injectGradleWrapper
(
String
projectDir
)
{
int
filesCreated
=
0
;
copyDirectorySync
(
cache
.
getArtifactDirectory
(
'gradle_wrapper'
),
fs
.
directory
(
fs
.
path
.
join
(
projectDir
,
'android'
)),
(
File
sourceFile
,
File
destinationFile
)
{
filesCreated
++;
final
String
modes
=
sourceFile
.
statSync
().
modeString
();
if
(
modes
!=
null
&&
modes
.
contains
(
'x'
))
{
os
.
makeExecutable
(
destinationFile
);
}
},
);
return
filesCreated
;
}
}
}
String
_createAndroidIdentifier
(
String
organization
,
String
name
)
{
String
_createAndroidIdentifier
(
String
organization
,
String
name
)
{
...
...
packages/flutter_tools/lib/src/services.dart
View file @
c5999c74
...
@@ -69,20 +69,18 @@ Future<Null> parseServiceConfigs(
...
@@ -69,20 +69,18 @@ Future<Null> parseServiceConfigs(
if
(
jars
!=
null
&&
serviceConfig
[
'jars'
]
is
Iterable
)
{
if
(
jars
!=
null
&&
serviceConfig
[
'jars'
]
is
Iterable
)
{
for
(
String
jar
in
serviceConfig
[
'jars'
])
for
(
String
jar
in
serviceConfig
[
'jars'
])
jars
.
add
(
fs
.
file
(
await
getServiceFromUrl
(
jar
,
serviceRoot
,
service
,
unzip:
false
)));
jars
.
add
(
fs
.
file
(
await
getServiceFromUrl
(
jar
,
serviceRoot
,
service
)));
}
}
}
}
}
}
Future
<
String
>
getServiceFromUrl
(
Future
<
String
>
getServiceFromUrl
(
String
url
,
String
rootDir
,
String
serviceName
)
async
{
String
url
,
String
rootDir
,
String
serviceName
,
{
bool
unzip:
false
}
)
async
{
if
(
url
.
startsWith
(
"android-sdk:"
)
&&
androidSdk
!=
null
)
{
if
(
url
.
startsWith
(
"android-sdk:"
)
&&
androidSdk
!=
null
)
{
// It's something shipped in the standard android SDK.
// It's something shipped in the standard android SDK.
return
url
.
replaceAll
(
'android-sdk:'
,
'
${androidSdk.directory}
/'
);
return
url
.
replaceAll
(
'android-sdk:'
,
'
${androidSdk.directory}
/'
);
}
else
if
(
url
.
startsWith
(
"http"
))
{
}
else
if
(
url
.
startsWith
(
"http"
))
{
// It's a regular file to download.
// It's a regular file to download.
return
await
cache
.
getThirdPartyFile
(
url
,
serviceName
,
unzip:
unzip
);
return
await
cache
.
getThirdPartyFile
(
url
,
serviceName
);
}
else
{
}
else
{
// Assume url is a path relative to the service's root dir.
// Assume url is a path relative to the service's root dir.
return
fs
.
path
.
join
(
rootDir
,
url
);
return
fs
.
path
.
join
(
rootDir
,
url
);
...
...
packages/flutter_tools/templates/create/android-java.tmpl/build.gradle
View file @
c5999c74
...
@@ -4,7 +4,7 @@ buildscript {
...
@@ -4,7 +4,7 @@ buildscript {
}
}
dependencies
{
dependencies
{
classpath
'com.android.tools.build:gradle:2.
2
.3'
classpath
'com.android.tools.build:gradle:2.
3
.3'
}
}
}
}
...
@@ -26,7 +26,3 @@ subprojects {
...
@@ -26,7 +26,3 @@ subprojects {
task
clean
(
type:
Delete
)
{
task
clean
(
type:
Delete
)
{
delete
rootProject
.
buildDir
delete
rootProject
.
buildDir
}
}
task
wrapper
(
type:
Wrapper
)
{
gradleVersion
=
'2.14.1'
}
packages/flutter_tools/templates/create/android-kotlin.tmpl/build.gradle
View file @
c5999c74
...
@@ -4,7 +4,7 @@ buildscript {
...
@@ -4,7 +4,7 @@ buildscript {
}
}
dependencies
{
dependencies
{
classpath
'com.android.tools.build:gradle:2.
2
.3'
classpath
'com.android.tools.build:gradle:2.
3
.3'
classpath
'org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-4'
classpath
'org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-4'
}
}
}
}
...
@@ -27,7 +27,3 @@ subprojects {
...
@@ -27,7 +27,3 @@ subprojects {
task
clean
(
type:
Delete
)
{
task
clean
(
type:
Delete
)
{
delete
rootProject
.
buildDir
delete
rootProject
.
buildDir
}
}
task
wrapper
(
type:
Wrapper
)
{
gradleVersion
=
'2.14.1'
}
packages/flutter_tools/templates/create/android.tmpl/.gitignore
View file @
c5999c74
...
@@ -7,7 +7,3 @@
...
@@ -7,7 +7,3 @@
/build
/build
/captures
/captures
GeneratedPluginRegistrant.java
GeneratedPluginRegistrant.java
/gradle
/gradlew
/gradlew.bat
packages/flutter_tools/templates/create/android.tmpl/gradle/wrapper/gradle-wrapper.properties
0 → 100644
View file @
c5999c74
#Fri Jun 23 08:50:38 CEST 2017
distributionBase
=
GRADLE_USER_HOME
distributionPath
=
wrapper/dists
zipStoreBase
=
GRADLE_USER_HOME
zipStorePath
=
wrapper/dists
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-3.3-all.zip
packages/flutter_tools/templates/plugin/android-java.tmpl/build.gradle.tmpl
View file @
c5999c74
...
@@ -7,7 +7,7 @@ buildscript {
...
@@ -7,7 +7,7 @@ buildscript {
}
}
dependencies {
dependencies {
classpath 'com.android.tools.build:gradle:2.3.
0
'
classpath 'com.android.tools.build:gradle:2.3.
3
'
}
}
}
}
...
...
packages/flutter_tools/templates/plugin/android-kotlin.tmpl/build.gradle.tmpl
View file @
c5999c74
...
@@ -7,7 +7,7 @@ buildscript {
...
@@ -7,7 +7,7 @@ buildscript {
}
}
dependencies {
dependencies {
classpath 'com.android.tools.build:gradle:2.3.
0
'
classpath 'com.android.tools.build:gradle:2.3.
3
'
}
}
}
}
...
...
packages/flutter_tools/templates/plugin/android.tmpl/.gitignore
View file @
c5999c74
...
@@ -6,7 +6,3 @@
...
@@ -6,7 +6,3 @@
.DS_Store
.DS_Store
/build
/build
/captures
/captures
/gradle
/gradlew
/gradlew.bat
packages/flutter_tools/templates/plugin/android.tmpl/gradle/wrapper/gradle-wrapper.properties
0 → 100644
View file @
c5999c74
#Fri Jun 23 08:50:38 CEST 2017
distributionBase
=
GRADLE_USER_HOME
distributionPath
=
wrapper/dists
zipStoreBase
=
GRADLE_USER_HOME
zipStorePath
=
wrapper/dists
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-3.3-all.zip
packages/flutter_tools/test/cache_test.dart
View file @
c5999c74
...
@@ -48,6 +48,34 @@ void main() {
...
@@ -48,6 +48,34 @@ void main() {
Platform:
()
=>
new
FakePlatform
()..
environment
=
<
String
,
String
>{
'FLUTTER_ALREADY_LOCKED'
:
'true'
},
Platform:
()
=>
new
FakePlatform
()..
environment
=
<
String
,
String
>{
'FLUTTER_ALREADY_LOCKED'
:
'true'
},
});
});
});
});
group
(
'Cache'
,
()
{
test
(
'should not be up to date, if some cached artifact is not'
,
()
{
final
CachedArtifact
artifact1
=
new
MockCachedArtifact
();
final
CachedArtifact
artifact2
=
new
MockCachedArtifact
();
when
(
artifact1
.
isUpToDate
()).
thenReturn
(
true
);
when
(
artifact2
.
isUpToDate
()).
thenReturn
(
false
);
final
Cache
cache
=
new
Cache
(
artifacts:
<
CachedArtifact
>[
artifact1
,
artifact2
]);
expect
(
cache
.
isUpToDate
(),
isFalse
);
});
test
(
'should be up to date, if all cached artifacts are'
,
()
{
final
CachedArtifact
artifact1
=
new
MockCachedArtifact
();
final
CachedArtifact
artifact2
=
new
MockCachedArtifact
();
when
(
artifact1
.
isUpToDate
()).
thenReturn
(
true
);
when
(
artifact2
.
isUpToDate
()).
thenReturn
(
true
);
final
Cache
cache
=
new
Cache
(
artifacts:
<
CachedArtifact
>[
artifact1
,
artifact2
]);
expect
(
cache
.
isUpToDate
(),
isTrue
);
});
test
(
'should update cached artifacts which are not up to date'
,
()
async
{
final
CachedArtifact
artifact1
=
new
MockCachedArtifact
();
final
CachedArtifact
artifact2
=
new
MockCachedArtifact
();
when
(
artifact1
.
isUpToDate
()).
thenReturn
(
true
);
when
(
artifact2
.
isUpToDate
()).
thenReturn
(
false
);
final
Cache
cache
=
new
Cache
(
artifacts:
<
CachedArtifact
>[
artifact1
,
artifact2
]);
await
cache
.
updateAll
();
verifyNever
(
artifact1
.
update
());
verify
(
artifact2
.
update
());
});
});
}
}
class
MockFileSystem
extends
MemoryFileSystem
{
class
MockFileSystem
extends
MemoryFileSystem
{
...
@@ -65,3 +93,4 @@ class MockFile extends Mock implements File {
...
@@ -65,3 +93,4 @@ class MockFile extends Mock implements File {
}
}
class
MockRandomAccessFile
extends
Mock
implements
RandomAccessFile
{}
class
MockRandomAccessFile
extends
Mock
implements
RandomAccessFile
{}
class
MockCachedArtifact
extends
Mock
implements
CachedArtifact
{}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment