Skip to content

Commit 1a9caa8

Browse files
committed
feat: bintray publisher configuration
1 parent 96d9206 commit 1a9caa8

18 files changed

+190
-87
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ A complete solution to package and build a ready for distribution Electron app f
88
* [Auto Update](#auto-update) ready application packaging.
99
* [Build version management](https://github.com/electron-userland/electron-builder/wiki/Options#build-version-management).
1010
* Numerous target formats:
11-
* All platforms: `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`.
11+
* All platforms: `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir` (unpacked directory).
1212
* [MacOS](https://github.com/electron-userland/electron-builder/wiki/Options#MacOptions-target): `dmg`, `mas`.
1313
* [Linux](https://github.com/electron-userland/electron-builder/wiki/Options#LinuxBuildOptions-target): `AppImage`, `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`.
1414
* [Windows](https://github.com/electron-userland/electron-builder/wiki/Options#WinBuildOptions-target): NSIS, Squirrel.Windows.

docs/Options.md

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ Don't customize paths to background and icon, — just follow conventions.
3535
* [.build.mas](#MasBuildOptions)
3636
* [.build.nsis](#NsisOptions)
3737
* [.build.protocols](#Protocol)
38+
* [.build.publish](#PublishConfiguration)
39+
* [.build.publish Bintray](#BintrayOptions)
40+
* [.build.publish GitHub](#GithubOptions)
3841
* [.build.squirrelWindows](#SquirrelWindowsOptions)
3942
* [.build.win](#WinBuildOptions)
4043
* [.directories](#MetadataDirectories)
@@ -82,6 +85,7 @@ Don't customize paths to background and icon, — just follow conventions.
8285
| npmSkipBuildFromSource | <a name="BuildMetadata-npmSkipBuildFromSource"></a>*two package.json structure only* Whether to omit using [--build-from-source](https://github.com/mapbox/node-pre-gyp#options) flag when installing app native deps. Defaults to `false`.
8386
| nodeGypRebuild | <a name="BuildMetadata-nodeGypRebuild"></a>Whether to execute `node-gyp rebuild` before starting to package the app. Defaults to `false`.
8487
| electronDist | <a name="BuildMetadata-electronDist"></a>The path to custom Electron build (e.g. `~/electron/out/R`). Only macOS supported, file issue if need for Linux or Windows.
88+
| publish | <a name="BuildMetadata-publish"></a>See [.build.publish](#publish).
8589

8690
<a name="DmgOptions"></a>
8791
### `.build.dmg`
@@ -114,7 +118,7 @@ The DMG windows position and size.
114118
<a name="FileAssociation"></a>
115119
### `.build.fileAssociations`
116120

117-
NSIS and MacOS only.
121+
macOS and NSIS only. Array of option objects.
118122

119123
| Name | Description
120124
| --- | ---
@@ -134,7 +138,7 @@ Linux specific build options.
134138
| category | <a name="LinuxBuildOptions-category"></a>The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).
135139
| packageCategory | <a name="LinuxBuildOptions-packageCategory"></a>The [package category](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Section). Not applicable for AppImage.
136140
| description | <a name="LinuxBuildOptions-description"></a>As [description](#AppMetadata-description) from application package.json, but allows you to specify different for Linux.
137-
| target | <a name="LinuxBuildOptions-target"></a><p>Target package type: list of <code>AppImage</code>, <code>deb</code>, <code>rpm</code>, <code>freebsd</code>, <code>pacman</code>, <code>p5p</code>, <code>apk</code>, <code>7z</code>, <code>zip</code>, <code>tar.xz</code>, <code>tar.lz</code>, <code>tar.gz</code>, <code>tar.bz2</code>. Defaults to <code>AppImage</code>.</p> <p>The most effective [xz](https://en.wikipedia.org/wiki/Xz) compression format used by default.</p> <p>Only <code>deb</code> and <code>AppImage</code> is tested. Feel free to file issues for <code>rpm</code> and other package formats.</p>
141+
| target | <a name="LinuxBuildOptions-target"></a><p>Target package type: list of <code>AppImage</code>, <code>deb</code>, <code>rpm</code>, <code>freebsd</code>, <code>pacman</code>, <code>p5p</code>, <code>apk</code>, <code>7z</code>, <code>zip</code>, <code>tar.xz</code>, <code>tar.lz</code>, <code>tar.gz</code>, <code>tar.bz2</code>, <code>dir</code>. Defaults to <code>AppImage</code>.</p> <p>The most effective [xz](https://en.wikipedia.org/wiki/Xz) compression format used by default.</p> <p>Only <code>deb</code> and <code>AppImage</code> is tested. Feel free to file issues for <code>rpm</code> and other package formats.</p>
138142
| synopsis | <a name="LinuxBuildOptions-synopsis"></a>*deb-only.* The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).
139143
| maintainer | <a name="LinuxBuildOptions-maintainer"></a>The maintainer. Defaults to [author](#AppMetadata-author).
140144
| vendor | <a name="LinuxBuildOptions-vendor"></a>The vendor. Defaults to [author](#AppMetadata-author).
@@ -150,7 +154,7 @@ MacOS specific build options.
150154
| Name | Description
151155
| --- | ---
152156
| category | <a name="MacOptions-category"></a><p>The application category type, as shown in the Finder via *View -&gt; Arrange by Application Category* when viewing the Applications directory.</p> <p>For example, <code>&quot;category&quot;: &quot;public.app-category.developer-tools&quot;</code> will set the application category to *Developer Tools*.</p> <p>Valid values are listed in [Apple’s documentation](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW8).</p>
153-
| target | <a name="MacOptions-target"></a>Target package type: list of `default`, `dmg`, `mas`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`. Defaults to `default` (dmg and zip for Squirrel.Mac).
157+
| target | <a name="MacOptions-target"></a>Target package type: list of `default`, `dmg`, `mas`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `default` (dmg and zip for Squirrel.Mac).
154158
| identity | <a name="MacOptions-identity"></a><p>The name of certificate to use when signing. Consider using environment variables [CSC_LINK or CSC_NAME](https://github.com/electron-userland/electron-builder/wiki/Code-Signing). MAS installer identity is specified in the [.build.mas](#MasBuildOptions-identity).</p>
155159
| icon | <a name="MacOptions-icon"></a>The path to application icon. Defaults to `build/icon.icns` (consider using this convention instead of complicating your configuration).
156160
| entitlements | <a name="MacOptions-entitlements"></a><p>The path to entitlements file for signing the app. <code>build/entitlements.mac.plist</code> will be used if exists (it is a recommended way to set). MAS entitlements is specified in the [.build.mas](#MasBuildOptions-entitlements).</p>
@@ -198,6 +202,32 @@ macOS only.
198202
| role | <a name="Protocol-role"></a>*macOS-only* The app’s role with respect to the type. The value can be `Editor`, `Viewer`, `Shell`, or `None`. Defaults to `Editor`.
199203
| **schemes** | <a name="Protocol-schemes"></a>The schemes. e.g. `["irc", "ircs"]`.
200204

205+
<a name="PublishConfiguration"></a>
206+
### `.build.publish`
207+
208+
Please see [Publishing Artifacts](https://github.com/electron-userland/electron-builder/wiki/Publishing-Artifacts).
209+
210+
Array of option objects.
211+
212+
| Name | Description
213+
| --- | ---
214+
| **provider** | <a name="PublishConfiguration-provider"></a>The provider, one of `github`, `bintray`.
215+
| owner | <a name="PublishConfiguration-owner"></a>The owner.
216+
217+
<a name="BintrayOptions"></a>
218+
### `.build.publish` Bintray
219+
| Name | Description
220+
| --- | ---
221+
| package | <a name="BintrayOptions-package"></a>The Bintray package name.
222+
| repo | <a name="BintrayOptions-repo"></a>The Bintray repository name. Defaults to `generic`.
223+
224+
<a name="GithubOptions"></a>
225+
### `.build.publish` GitHub
226+
| Name | Description
227+
| --- | ---
228+
| repo | <a name="GithubOptions-repo"></a>The repository name. [Detected automatically](https://github.com/electron-userland/electron-builder/wiki/Publishing-Artifacts#github-repository).
229+
| vPrefixedTagName | <a name="GithubOptions-vPrefixedTagName"></a>Whether to use `v`-prefixed tag name. Defaults to `true`.
230+
201231
<a name="SquirrelWindowsOptions"></a>
202232
### `.build.squirrelWindows`
203233
| Name | Description
@@ -216,7 +246,7 @@ Windows specific build options.
216246

217247
| Name | Description
218248
| --- | ---
219-
| target | <a name="WinBuildOptions-target"></a>Target package type: list of `nsis`, `squirrel`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`. Defaults to `squirrel`.
249+
| target | <a name="WinBuildOptions-target"></a>Target package type: list of `nsis`, `squirrel`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `squirrel`.
220250
| signingHashAlgorithms | <a name="WinBuildOptions-signingHashAlgorithms"></a>Array of signing algorithms used. Defaults to `['sha1', 'sha256']`
221251
| icon | <a name="WinBuildOptions-icon"></a>The path to application icon. Defaults to `build/icon.ico` (consider using this convention instead of complicating your configuration).
222252
| legalTrademarks | <a name="WinBuildOptions-legalTrademarks"></a>The trademarks and registered trademarks.

docs/Publishing Artifacts.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
Travis and AppVeyor support publishing artifacts. But it requires additional configuration. For each CI (since AppVeyor can build only Windows and Travis only MacOS / Linux).
1+
Travis and AppVeyor support publishing artifacts. But it requires additional configuration. For each CI (since AppVeyor can build only Windows and Travis only macOS / Linux).
22

33
`electron-builder` allows you to just add `GH_TOKEN` environment variable and that's all.
44

5-
Currently, only GitHub Releases is supported.
5+
Currently, [GitHub Releases](https://help.github.com/articles/about-releases/) and [Bintray](https://bintray.com) are supported.
66

7-
`--publish` option values:
7+
CLI `--publish` option values:
88

99
| Value | Description
1010
| -------------- | -----------
@@ -38,9 +38,19 @@ But please consider using automatic rules instead of explicitly specifying `publ
3838
```
3939
and if you run `npm run release`, a release will be drafted (if doesn't already exist) and artifacts published.
4040

41-
# GitHub Repository
41+
# GitHub Repository and Bintray Package
4242

43-
No option to specify GitHub repository, detected automatically using:
43+
Detected automatically using:
4444
* [repository](https://docs.npmjs.com/files/package.json#repository) in the application or development `package.json`,
4545
* if not set, env `TRAVIS_REPO_SLUG` or `APPVEYOR_ACCOUNT_NAME`/`APPVEYOR_PROJECT_NAME` or `CIRCLE_PROJECT_USERNAME`/`CIRCLE_PROJECT_REPONAME`,
4646
* if no env, from `.git/config` origin url.
47+
48+
# Publish Options
49+
50+
[build.publish](https://github.com/electron-userland/electron-builder/wiki/Options#PublishConfiguration) can be specified in [build](https://github.com/electron-userland/electron-builder/wiki/Options#build) or any platform- or target- specific options.
51+
52+
```json
53+
"win": {
54+
"publish": ["github", "bintray"]
55+
}
56+
```

nsis-auto-updater/src/BintrayProvider.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Provider, VersionInfo, FileInfo } from "./api"
2-
import { BintrayClient, BintrayOptions } from "../../src/publish/bintray"
2+
import { BintrayClient } from "../../src/publish/bintray"
33
import { HttpError } from "../../src/publish/restApiRequest"
4+
import { BintrayOptions } from "../../src/options/publishOptions"
45

56
//noinspection JSUnusedLocalSymbols
67
const __awaiter = require("../../src/util/awaiter")
@@ -9,7 +10,7 @@ export class BintrayProvider implements Provider {
910
private client: BintrayClient
1011

1112
constructor(configuration: BintrayOptions) {
12-
this.client = new BintrayClient(configuration.user, configuration.package, configuration.repo)
13+
this.client = new BintrayClient(configuration.owner!, configuration.package!, configuration.repo)
1314
}
1415

1516
async getLatestVersion(): Promise<VersionInfo> {
@@ -35,7 +36,7 @@ export class BintrayProvider implements Provider {
3536
if (file.name.endsWith(suffix) && file.name.includes("Setup")) {
3637
return {
3738
name: file.name,
38-
url: `https://dl.bintray.com/${this.client.user}/${this.client.repo}/${file.name}`,
39+
url: `https://dl.bintray.com/${this.client.owner}/${this.client.repo}/${file.name}`,
3940
}
4041
}
4142
}

nsis-auto-updater/src/main.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { NsisUpdater } from "./nsis-updater"
2+
3+
if (process.platform === "win32") {
4+
module.exports = require("electron").autoUpdater
5+
}
6+
else {
7+
const updater: NsisUpdater = new (require("./nsis-updater").NsisUpdater)()
8+
9+
module.exports = updater
10+
}

nsis-auto-updater/src/nsis-updater.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import { EventEmitter } from "events"
22
import { spawn } from "child_process"
33
import * as path from "path"
44
import { tmpdir } from "os"
5-
import { BintrayOptions } from "../../src/publish/bintray"
65
import semver = require("semver")
76
import { download } from "../../src/util/httpRequest"
87
import { Provider, UpdateCheckResult } from "./api"
98
import { BintrayProvider } from "./BintrayProvider"
109
import { Promise as BluebirdPromise } from "bluebird"
10+
import { BintrayOptions, PublishConfiguration, GithubOptions } from "../../src/options/publishOptions"
1111

1212
//noinspection JSUnusedLocalSymbols
1313
const __awaiter = require("../../src/util/awaiter")
@@ -22,24 +22,37 @@ export class NsisUpdater extends EventEmitter {
2222

2323
private readonly app: any
2424

25-
constructor(public updateUrl?: string) {
25+
constructor(options?: PublishConfiguration | BintrayOptions | GithubOptions) {
2626
super()
2727

2828
this.app = (<any>global).__test_app || require("electron").app
29+
30+
if (options != null) {
31+
this.setFeedURL(options)
32+
}
2933
}
3034

3135
getFeedURL(): string | null | undefined {
32-
return this.updateUrl
36+
return JSON.stringify(this.client, null, 2)
3337
}
3438

35-
setFeedURL(value: string | BintrayOptions) {
36-
this.updateUrl = value.toString()
37-
38-
this.client = new BintrayProvider(<BintrayOptions>value)
39+
setFeedURL(value: string | PublishConfiguration | BintrayOptions | GithubOptions) {
40+
if (typeof value === "string") {
41+
throw new Error("Please pass PublishConfiguration object")
42+
}
43+
else {
44+
const provider = (<PublishConfiguration>value).provider
45+
if (provider === "bintray") {
46+
this.client = new BintrayProvider(<BintrayOptions>value)
47+
}
48+
else {
49+
throw new Error(`Unsupported provider: ${provider}`)
50+
}
51+
}
3952
}
4053

4154
checkForUpdates(): Promise<UpdateCheckResult> {
42-
if (this.updateUrl == null) {
55+
if (this.client == null) {
4356
const message = "Update URL is not set"
4457
this.emitError(message)
4558
return BluebirdPromise.reject(new Error(message))

nsis-auto-updater/tsconfig.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
"../node_modules/fs-extra-p/bluebird.d.ts",
2626
"../src/util/httpRequest.ts",
2727
"../src/publish/restApiRequest.ts",
28+
"../src/publish/restApiRequest.ts",
2829
"../src/publish/bintray.ts",
30+
"../src/options/publishOptions.ts",
2931
"../src/util/awaiter.ts"
3032
],
3133
"include": [

src/builder.ts

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import { Platform, Arch, archFromString } from "./metadata"
1010
import { getRepositoryInfo } from "./repositoryInfo"
1111
import { DIR_TARGET } from "./targets/targetFactory"
1212
import { BintrayPublisher } from "./publish/BintrayPublisher"
13-
import { BintrayOptions } from "./publish/bintray"
14-
import { PublishConfiguration, GithubPublishConfiguration } from "./options/publishOptions"
13+
import { PublishConfiguration, GithubOptions, BintrayOptions } from "./options/publishOptions"
1514

1615
//noinspection JSUnusedLocalSymbols
1716
const __awaiter = require("./util/awaiter")
@@ -300,7 +299,7 @@ function publishManager(packager: Packager, publishTasks: Array<BluebirdPromise<
300299
})
301300
}
302301

303-
export async function createPublisher(packager: Packager, options: PublishOptions, publishConfig: PublishConfiguration | GithubPublishConfiguration, isPublishOptionGuessed: boolean = false): Promise<Publisher | null> {
302+
export async function createPublisher(packager: Packager, options: PublishOptions, publishConfig: PublishConfiguration | GithubOptions | BintrayOptions, isPublishOptionGuessed: boolean = false): Promise<Publisher | null> {
304303
async function getInfo() {
305304
const info = await getRepositoryInfo(packager.metadata, packager.devMetadata)
306305
if (info != null) {
@@ -312,37 +311,35 @@ export async function createPublisher(packager: Packager, options: PublishOption
312311
}
313312

314313
warn("Cannot detect repository by .git/config")
315-
throw new Error(`Please specify 'repository' in the dev package.json ('${packager.devPackageFile}')`)
314+
throw new Error(`Please specify "repository" in the dev package.json ('${packager.devPackageFile}').\nPlease see https://github.com/electron-userland/electron-builder/wiki/Publishing-Artifacts`)
316315
}
317316

318-
if (publishConfig.provider === "github") {
319-
const config = <GithubPublishConfiguration>publishConfig
320-
let user = config.owner
321-
let repo = config.repo
322-
if (!user || !repo) {
323-
const info = await getInfo()
324-
if (info == null) {
325-
return null
326-
}
317+
let owner = publishConfig.owner
318+
let project = publishConfig.provider === "github" ? (<GithubOptions>publishConfig).repo : (<BintrayOptions>publishConfig).package
319+
if (!owner || !project) {
320+
const info = await getInfo()
321+
if (info == null) {
322+
return null
323+
}
327324

328-
user = info.user
329-
repo = info.project
325+
if (!owner) {
326+
owner = info.user
327+
}
328+
if (!project) {
329+
project = info.project
330330
}
331+
}
331332

333+
if (publishConfig.provider === "github") {
334+
const config = <GithubOptions>publishConfig
332335
const version = packager.metadata.version!
333-
log(`Creating Github Publisher — user: ${user}, project: ${repo}, version: ${version}`)
334-
return new GitHubPublisher(user, repo, version, options, isPublishOptionGuessed, config)
336+
log(`Creating Github Publisher — owner: ${owner}, project: ${project}, version: ${version}`)
337+
return new GitHubPublisher(owner, project, version, options, isPublishOptionGuessed, config)
335338
}
336339
if (publishConfig.provider === "bintray") {
337-
const info = await getInfo()
338-
if (info == null) {
339-
return null
340-
}
341-
342340
const version = packager.metadata.version!
343-
//noinspection ReservedWordAsName
344-
const bintrayInfo: BintrayOptions = {user: info.user, package: info.project, repo: "generic"}
345-
log(`Creating Bintray Publisher — user: ${bintrayInfo.user}, package: ${bintrayInfo.package}, repository: ${bintrayInfo.repo}, version: ${version}`)
341+
const bintrayInfo: BintrayOptions = Object.assign({}, publishConfig, {owner: owner, package: project, repo: "generic"})
342+
log(`Creating Bintray Publisher — user: ${bintrayInfo.owner}, package: ${bintrayInfo.package}, repository: ${bintrayInfo.repo}, version: ${version}`)
346343
return new BintrayPublisher(bintrayInfo, version, options)
347344
}
348345
return null

src/metadata.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ export interface BuildMetadata {
223223

224224
readonly dereference?: boolean
225225

226+
/*
227+
See [.build.publish](#PublishConfiguration).
228+
*/
226229
readonly publish?: string | Array<string> | null | PublishConfiguration
227230
}
228231

@@ -257,7 +260,7 @@ export interface LinuxBuildOptions extends PlatformSpecificBuildOptions {
257260
readonly description?: string | null
258261

259262
/*
260-
Target package type: list of `AppImage`, `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`. Defaults to `AppImage`.
263+
Target package type: list of `AppImage`, `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `AppImage`.
261264
262265
The most effective [xz](https://en.wikipedia.org/wiki/Xz) compression format used by default.
263266
@@ -305,7 +308,7 @@ export interface LinuxBuildOptions extends PlatformSpecificBuildOptions {
305308
/*
306309
### `.build.fileAssociations`
307310
308-
NSIS and MacOS only.
311+
macOS and NSIS only. Array of option objects.
309312
*/
310313
export interface FileAssociation {
311314
/*

src/options/macOptions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export interface MacOptions extends PlatformSpecificBuildOptions {
1616
readonly category?: string | null
1717

1818
/*
19-
Target package type: list of `default`, `dmg`, `mas`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`. Defaults to `default` (dmg and zip for Squirrel.Mac).
19+
Target package type: list of `default`, `dmg`, `mas`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `default` (dmg and zip for Squirrel.Mac).
2020
*/
2121
readonly target?: Array<string> | null
2222

0 commit comments

Comments
 (0)