在 APPXBUNDLE 中打包 APPX
Package APPX in APPXBUNDLE
我目前在 Windows 商店中提交了一个 UWP 应用程序,现在我想发布一个更新。此更新基于 Electron,因此不再是 UWP 应用程序。
我只想将 Electron 应用程序提交到 Windows 商店,但我收到此错误消息:A previous submission for this app was released with a Windows 10 .msixbundle or .appxbundle. Subsequent submissions must continue to contain a Windows 10 .msixbundle or .appxbundle.
Electron 应用程序与 electron-builder
打包在一起,生成的文件是 appx
文件。之前我用 Visual Studio 打包了应用程序,生成的文件是 appxbundle
.
根据此错误消息,我必须提交 .msixbundle
或 .appxbundle
文件。我可以只创建一个包含 Electron .appx
文件的 .appxbundle
,然后将应用程序提交到 Windows 商店吗?
谢谢
是的,您可以,这是一篇来自 MSFT 的分步文章,展示了如何为现有 msix/appx 包生成 MSIX 包。
可以为 Windows 商店编译 Electron Apps。 Microsoft 制定了 a tool that compiles Electron apps as .appx packages,enabling developers to use some of the goodies found in the new application model. The new .appx format does not only enable a number of new powerful APIs like Cortana or Push Notifications, but through the Windows Store, also simplifies installation and updating. You could refer to Electron Documentation: Windows Store Guide and Microsoft Blog Compiling Electron Apps for the Windows Store 详细步骤和要求。
这是对我自己的问题的承诺答案。
正如我已经提到的,您必须坚持最初将您的应用程序提交到 Microsoft App Store 的捆绑包格式。所以 .appxbundle
就我而言。
我正在使用 electron-builder
吐出一个 .appx
然后我使用 afterAllArtifactBuildHook
捆绑到 .appxbundle
这是位于我的电子项目 build/hooks
文件夹中的 afterAllArtifactBuildHook.js
。它会自动利用 electron-builder
中已缓存的 winCodeSign
工具,以确保一切匹配。
注意:这是针对 macOS 和功能性 Parallels 桌面安装,Windows10 已经设置为构建 .appx
文件
var path = require("path"),
fs = require("fs"),
glob = require("glob"),
childProcess = require('child_process');
exports.default = function(buildResult) {
buildResult.artifactPaths.forEach(function(appxPath) {
if (appxPath.endsWith(".appx")) {
convertAppx2AppxBundle(appxPath);
}
});
};
/**
* Converts a Unix Path to a Windows conforming path by replacing any "/" with "\"
* @return {string}
*/
String.prototype.windowsify = function windowsify() {
return this.replace(/\//g, "\");
}
/**
* Converts the given appx to an appxbundle used for Windows Store submission
* @note This function utalizes the parallels desktop tool "prlctl" to execute windows commands via macOS
* @param appxPath
*/
function convertAppx2AppxBundle(appxPath) {
try {
console.log("Converting Appx to Appxbundle...")
// We'll use electron-builder's winCodeSign tools which are conveniently already available in the following dir
var electronBuilderDir = path.join(process.env.HOME, "Library/Caches/electron-builder"), // Don't use "~" it will just not work, trust me...
// Will use the first matching windowsCodeSigning path as we may have multiple versions installed
makeAppX = glob.sync(path.join(electronBuilderDir, "winCodeSign", "winCodeSign-*", "windows-10", "x64", "makeappx.exe"))[0],
appxBundleMapFile = // This file is required by the makeappx.exe to generate the appxbundle
'[Files]\n' +
'"\\Mac\AllFiles' + appxPath.replace(/\//g, "\") + '"\t\t"Loxone.appx"';
// Save the generated AppxBundle.map file to the filesystem to make it available for the Windows VM
fs.writeFileSync(path.join(__dirname, "..", "AppxBundle.map"), appxBundleMapFile, { flag: "w" });
var prlctlArgs = [
'exec',
'"Windows 10"', // the name of the specific Windows VM
'--current-user', // We want to execute the following command with the current user
// From this point on its the default Windows CLI command for converting an .appx to an .apppxbundle
// Its important to know that these parts must conform to the Windows style, hence the windowsify function
// We also need to use double quotation for the network shares due to how childProcess.execSync works...
'"\\\Mac\AllFiles' + makeAppX.windowsify() + '"',
'bundle',
'/f',
'"\\\Mac\AllFiles' + (__dirname.replace("/hooks", "") + "/AppxBundle.map").windowsify() + '"',
'/p',
'"\\\Mac\AllFiles' + appxPath.windowsify() + 'bundle"',
'/o'
];
// Now just execute the command to convert the appx to an appxbundle
childProcess.execSync('prlctl ' + prlctlArgs.join(" "), { stdio: 'inherit' });
console.log("Done converting Appx to Appxbundle");
} catch (e) {
console.warn("Couldn't convert appx two appxbundle!");
console.error(e);
}
}
我目前在 Windows 商店中提交了一个 UWP 应用程序,现在我想发布一个更新。此更新基于 Electron,因此不再是 UWP 应用程序。
我只想将 Electron 应用程序提交到 Windows 商店,但我收到此错误消息:A previous submission for this app was released with a Windows 10 .msixbundle or .appxbundle. Subsequent submissions must continue to contain a Windows 10 .msixbundle or .appxbundle.
Electron 应用程序与 electron-builder
打包在一起,生成的文件是 appx
文件。之前我用 Visual Studio 打包了应用程序,生成的文件是 appxbundle
.
根据此错误消息,我必须提交 .msixbundle
或 .appxbundle
文件。我可以只创建一个包含 Electron .appx
文件的 .appxbundle
,然后将应用程序提交到 Windows 商店吗?
谢谢
是的,您可以,这是一篇来自 MSFT 的分步文章,展示了如何为现有 msix/appx 包生成 MSIX 包。
可以为 Windows 商店编译 Electron Apps。 Microsoft 制定了 a tool that compiles Electron apps as .appx packages,enabling developers to use some of the goodies found in the new application model. The new .appx format does not only enable a number of new powerful APIs like Cortana or Push Notifications, but through the Windows Store, also simplifies installation and updating. You could refer to Electron Documentation: Windows Store Guide and Microsoft Blog Compiling Electron Apps for the Windows Store 详细步骤和要求。
这是对我自己的问题的承诺答案。
正如我已经提到的,您必须坚持最初将您的应用程序提交到 Microsoft App Store 的捆绑包格式。所以 .appxbundle
就我而言。
我正在使用 electron-builder
吐出一个 .appx
然后我使用 afterAllArtifactBuildHook
.appxbundle
这是位于我的电子项目 build/hooks
文件夹中的 afterAllArtifactBuildHook.js
。它会自动利用 electron-builder
中已缓存的 winCodeSign
工具,以确保一切匹配。
注意:这是针对 macOS 和功能性 Parallels 桌面安装,Windows10 已经设置为构建 .appx
文件
var path = require("path"),
fs = require("fs"),
glob = require("glob"),
childProcess = require('child_process');
exports.default = function(buildResult) {
buildResult.artifactPaths.forEach(function(appxPath) {
if (appxPath.endsWith(".appx")) {
convertAppx2AppxBundle(appxPath);
}
});
};
/**
* Converts a Unix Path to a Windows conforming path by replacing any "/" with "\"
* @return {string}
*/
String.prototype.windowsify = function windowsify() {
return this.replace(/\//g, "\");
}
/**
* Converts the given appx to an appxbundle used for Windows Store submission
* @note This function utalizes the parallels desktop tool "prlctl" to execute windows commands via macOS
* @param appxPath
*/
function convertAppx2AppxBundle(appxPath) {
try {
console.log("Converting Appx to Appxbundle...")
// We'll use electron-builder's winCodeSign tools which are conveniently already available in the following dir
var electronBuilderDir = path.join(process.env.HOME, "Library/Caches/electron-builder"), // Don't use "~" it will just not work, trust me...
// Will use the first matching windowsCodeSigning path as we may have multiple versions installed
makeAppX = glob.sync(path.join(electronBuilderDir, "winCodeSign", "winCodeSign-*", "windows-10", "x64", "makeappx.exe"))[0],
appxBundleMapFile = // This file is required by the makeappx.exe to generate the appxbundle
'[Files]\n' +
'"\\Mac\AllFiles' + appxPath.replace(/\//g, "\") + '"\t\t"Loxone.appx"';
// Save the generated AppxBundle.map file to the filesystem to make it available for the Windows VM
fs.writeFileSync(path.join(__dirname, "..", "AppxBundle.map"), appxBundleMapFile, { flag: "w" });
var prlctlArgs = [
'exec',
'"Windows 10"', // the name of the specific Windows VM
'--current-user', // We want to execute the following command with the current user
// From this point on its the default Windows CLI command for converting an .appx to an .apppxbundle
// Its important to know that these parts must conform to the Windows style, hence the windowsify function
// We also need to use double quotation for the network shares due to how childProcess.execSync works...
'"\\\Mac\AllFiles' + makeAppX.windowsify() + '"',
'bundle',
'/f',
'"\\\Mac\AllFiles' + (__dirname.replace("/hooks", "") + "/AppxBundle.map").windowsify() + '"',
'/p',
'"\\\Mac\AllFiles' + appxPath.windowsify() + 'bundle"',
'/o'
];
// Now just execute the command to convert the appx to an appxbundle
childProcess.execSync('prlctl ' + prlctlArgs.join(" "), { stdio: 'inherit' });
console.log("Done converting Appx to Appxbundle");
} catch (e) {
console.warn("Couldn't convert appx two appxbundle!");
console.error(e);
}
}