mirror of
https://github.com/flutter/flutter
synced 2024-10-02 22:44:13 +00:00
[flutter_tools] Add --build-number and --build-name support to web and linux (#100377)
This commit is contained in:
parent
391a39a6e9
commit
78ae72b0b2
|
@ -237,6 +237,10 @@ class BuildInfo {
|
|||
kFileSystemRoots: fileSystemRoots.join(','),
|
||||
if (fileSystemScheme != null)
|
||||
kFileSystemScheme: fileSystemScheme!,
|
||||
if (buildName != null)
|
||||
kBuildName: buildName!,
|
||||
if (buildNumber != null)
|
||||
kBuildNumber: buildNumber!,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -952,6 +956,12 @@ const String kIconTreeShakerFlag = 'TreeShakeIcons';
|
|||
/// The input key for an SkSL bundle path.
|
||||
const String kBundleSkSLPath = 'BundleSkSLPath';
|
||||
|
||||
/// The define to pass build name
|
||||
const String kBuildName = 'BuildName';
|
||||
|
||||
/// The define to pass build number
|
||||
const String kBuildNumber = 'BuildNumber';
|
||||
|
||||
final Converter<String, String> _defineEncoder = utf8.encoder.fuse(base64.encoder);
|
||||
final Converter<String, String> _defineDecoder = base64.decoder.fuse(utf8.decoder);
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
import '../../artifacts.dart';
|
||||
import '../../base/file_system.dart';
|
||||
import '../../build_info.dart';
|
||||
import '../../convert.dart';
|
||||
import '../../devfs.dart';
|
||||
import '../../project.dart';
|
||||
import '../build_system.dart';
|
||||
|
@ -135,7 +136,7 @@ abstract class BundleLinuxAssets extends Target {
|
|||
environment.buildDir.childFile('app.dill')
|
||||
.copySync(outputDirectory.childFile('kernel_blob.bin').path);
|
||||
}
|
||||
final String versionInfo = FlutterProject.current().getVersionInfo();
|
||||
final String versionInfo = getVersionInfo(environment.defines);
|
||||
final Depfile depfile = await copyAssets(
|
||||
environment,
|
||||
outputDirectory,
|
||||
|
@ -153,6 +154,23 @@ abstract class BundleLinuxAssets extends Target {
|
|||
environment.buildDir.childFile('flutter_assets.d'),
|
||||
);
|
||||
}
|
||||
|
||||
/// Return json encoded string that contains data about version for package_info
|
||||
String getVersionInfo(Map<String, String> defines) {
|
||||
final Map<String, dynamic> versionInfo =
|
||||
jsonDecode(FlutterProject.current().getVersionInfo())
|
||||
as Map<String, dynamic>;
|
||||
|
||||
if (defines.containsKey(kBuildNumber)) {
|
||||
versionInfo['build_number'] = defines[kBuildNumber];
|
||||
}
|
||||
|
||||
if (defines.containsKey(kBuildName)) {
|
||||
versionInfo['version'] = defines[kBuildName];
|
||||
}
|
||||
|
||||
return jsonEncode(versionInfo);
|
||||
}
|
||||
}
|
||||
|
||||
/// A wrapper for AOT compilation that copies app.so into the output directory.
|
||||
|
|
|
@ -341,10 +341,7 @@ class WebReleaseBundle extends Target {
|
|||
);
|
||||
}
|
||||
|
||||
final String versionInfo = FlutterProject.current().getVersionInfo();
|
||||
environment.outputDir
|
||||
.childFile('version.json')
|
||||
.writeAsStringSync(versionInfo);
|
||||
createVersionFile(environment, environment.defines);
|
||||
final Directory outputDirectory = environment.outputDir.childDirectory('assets');
|
||||
outputDirectory.createSync(recursive: true);
|
||||
final Depfile depfile = await copyAssets(
|
||||
|
@ -411,6 +408,25 @@ class WebReleaseBundle extends Target {
|
|||
environment.buildDir.childFile('web_resources.d'),
|
||||
);
|
||||
}
|
||||
|
||||
/// Create version.json file that contains data about version for package_info
|
||||
void createVersionFile(Environment environment, Map<String, String> defines) {
|
||||
final Map<String, dynamic> versionInfo =
|
||||
jsonDecode(FlutterProject.current().getVersionInfo())
|
||||
as Map<String, dynamic>;
|
||||
|
||||
if (defines.containsKey(kBuildNumber)) {
|
||||
versionInfo['build_number'] = defines[kBuildNumber];
|
||||
}
|
||||
|
||||
if (defines.containsKey(kBuildName)) {
|
||||
versionInfo['version'] = defines[kBuildName];
|
||||
}
|
||||
|
||||
environment.outputDir
|
||||
.childFile('version.json')
|
||||
.writeAsStringSync(jsonEncode(versionInfo));
|
||||
}
|
||||
}
|
||||
|
||||
/// Static assets provided by the Flutter SDK that do not change, such as
|
||||
|
|
|
@ -22,6 +22,8 @@ class BuildLinuxCommand extends BuildSubCommand {
|
|||
}) : _operatingSystemUtils = operatingSystemUtils,
|
||||
super(verboseHelp: verboseHelp) {
|
||||
addCommonDesktopBuildOptions(verboseHelp: verboseHelp);
|
||||
usesBuildNumberOption();
|
||||
usesBuildNameOption();
|
||||
final String defaultTargetPlatform =
|
||||
(_operatingSystemUtils.hostPlatform == HostPlatform.linux_arm64) ?
|
||||
'linux-arm64' : 'linux-x64';
|
||||
|
|
|
@ -20,6 +20,8 @@ class BuildWebCommand extends BuildSubCommand {
|
|||
addTreeShakeIconsFlag(enabledByDefault: false);
|
||||
usesTargetOption();
|
||||
usesPubOption();
|
||||
usesBuildNumberOption();
|
||||
usesBuildNameOption();
|
||||
addBuildModeFlags(verboseHelp: verboseHelp, excludeDebug: true);
|
||||
usesDartDefineOption();
|
||||
usesWebRendererOption();
|
||||
|
|
|
@ -148,6 +148,31 @@ void main() {
|
|||
ProcessManager: () => FakeProcessManager.any(),
|
||||
BuildSystem: () => TestBuildSystem.all(BuildResult(success: true)),
|
||||
});
|
||||
|
||||
testUsingContext('Web build supports build-name and build-number', () async {
|
||||
final TestWebBuildCommand buildCommand = TestWebBuildCommand();
|
||||
final CommandRunner<void> runner = createTestCommandRunner(buildCommand);
|
||||
setupFileSystemForEndToEndTest(fileSystem);
|
||||
|
||||
await runner.run(<String>[
|
||||
'build',
|
||||
'web',
|
||||
'--no-pub',
|
||||
'--build-name=1.2.3',
|
||||
'--build-number=42',
|
||||
]);
|
||||
|
||||
final BuildInfo buildInfo = await buildCommand.webCommand
|
||||
.getBuildInfo(forcedBuildMode: BuildMode.debug);
|
||||
expect(buildInfo.buildNumber, '42');
|
||||
expect(buildInfo.buildName, '1.2.3');
|
||||
}, overrides: <Type, Generator>{
|
||||
Platform: () => fakePlatform,
|
||||
FileSystem: () => fileSystem,
|
||||
FeatureFlags: () => TestFeatureFlags(isWebEnabled: true),
|
||||
ProcessManager: () => FakeProcessManager.any(),
|
||||
BuildSystem: () => TestBuildSystem.all(BuildResult(success: true)),
|
||||
});
|
||||
}
|
||||
|
||||
void setupFileSystemForEndToEndTest(FileSystem fileSystem) {
|
||||
|
|
|
@ -121,6 +121,8 @@ void main() {
|
|||
codeSizeDirectory: 'foo/code-size',
|
||||
fileSystemRoots: <String>['test5', 'test6'],
|
||||
fileSystemScheme: 'scheme',
|
||||
buildName: '122',
|
||||
buildNumber: '22'
|
||||
);
|
||||
|
||||
expect(buildInfo.toBuildSystemEnvironment(), <String, String>{
|
||||
|
@ -136,6 +138,8 @@ void main() {
|
|||
'CodeSizeDirectory': 'foo/code-size',
|
||||
'FileSystemRoots': 'test5,test6',
|
||||
'FileSystemScheme': 'scheme',
|
||||
'BuildName': '122',
|
||||
'BuildNumber': '22',
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -100,6 +100,8 @@ void main() {
|
|||
fileSystem.currentDirectory,
|
||||
defines: <String, String>{
|
||||
kBuildMode: 'debug',
|
||||
kBuildName: '2.0.0',
|
||||
kBuildNumber: '22',
|
||||
},
|
||||
inputs: <String, String>{
|
||||
kBundleSkSLPath: 'bundle.sksl',
|
||||
|
@ -133,6 +135,9 @@ void main() {
|
|||
expect(output.childFile('kernel_blob.bin'), exists);
|
||||
expect(output.childFile('AssetManifest.json'), exists);
|
||||
expect(output.childFile('version.json'), exists);
|
||||
final String versionFile = output.childFile('version.json').readAsStringSync();
|
||||
expect(versionFile, contains('"version":"2.0.0"'));
|
||||
expect(versionFile, contains('"build_number":"22"'));
|
||||
// SkSL
|
||||
expect(output.childFile('io.flutter.shaders.json'), exists);
|
||||
expect(output.childFile('io.flutter.shaders.json').readAsStringSync(), '{"data":{"A":"B"}}');
|
||||
|
|
|
@ -102,6 +102,22 @@ void main() {
|
|||
expect(environment.outputDir.childFile('version.json'), exists);
|
||||
}));
|
||||
|
||||
test('override version values', () => testbed.run(() async {
|
||||
environment.defines[kBuildMode] = 'release';
|
||||
environment.defines[kBuildName] = '2.0.0';
|
||||
environment.defines[kBuildNumber] = '22';
|
||||
final Directory webResources = environment.projectDir.childDirectory('web');
|
||||
webResources.childFile('index.html').createSync(recursive: true);
|
||||
environment.buildDir.childFile('main.dart.js').createSync();
|
||||
await const WebReleaseBundle().build(environment);
|
||||
|
||||
final String versionFile = environment.outputDir
|
||||
.childFile('version.json')
|
||||
.readAsStringSync();
|
||||
expect(versionFile, contains('"version":"2.0.0"'));
|
||||
expect(versionFile, contains('"build_number":"22"'));
|
||||
}));
|
||||
|
||||
test('Base href is created in index.html with given base-href after release build', () => testbed.run(() async {
|
||||
environment.defines[kBuildMode] = 'release';
|
||||
environment.defines[kBaseHref] = '/basehreftest/';
|
||||
|
|
Loading…
Reference in a new issue