├── .gitignore ├── .github ├── funding.yml └── workflows │ └── release-binaries.yml ├── .editorconfig ├── .eslintrc.json ├── .travis.yml ├── index.js ├── test.js ├── example.js ├── package.json ├── LICENSE ├── README.md └── install.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | .DS_Store 3 | node_modules/ 4 | npm-debug.log 5 | 6 | build/* 7 | !build/index.sh 8 | 9 | bin/* 10 | 11 | /ffmpeg 12 | /ffmpeg.exe 13 | /ffmpeg.README 14 | /ffmpeg.LICENSE 15 | -------------------------------------------------------------------------------- /.github/funding.yml: -------------------------------------------------------------------------------- 1 | custom: https://ffmpeg.org/donations.html 2 | patreon: johnvansickle 3 | custom: https://www.paypal.me/johnvansickle 4 | custom: bitcoin:13pZjChR1gR6wqzGMuwLAzqeVR5o9XGoCP 5 | custom: https://www.johnvansickle.com/ffmpeg/ 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | indent_style = spaces 10 | indent_size = 2 11 | 12 | [example.js] 13 | indent_style = tab 14 | indent_size = 4 15 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "eslint:recommended", 3 | "env": { 4 | "commonjs": true, 5 | "es6": true, 6 | "node": true 7 | }, 8 | "parserOptions": { 9 | "ecmaVersion": 2018 10 | }, 11 | "globals": { 12 | "Atomics": "readonly", 13 | "SharedArrayBuffer": "readonly" 14 | }, 15 | "rules": { 16 | "no-unused-vars": "off" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 'stable' 4 | - 'lts/*' 5 | - 'lts/dubnium' 6 | addons: 7 | apt: 8 | packages: 9 | - unzip 10 | - tar 11 | script: 12 | - npm run install 13 | - npm test 14 | - 'file=$(npm pack -s) && file=$(realpath $file)' 15 | - 'cd $(mktemp -d) && npm init -y' 16 | - 'touch foo && env FFMPEG_BIN=$(realpath foo) npm i "$file"' 17 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | if (process.env.FFMPEG_BIN) { 4 | module.exports = process.env.FFMPEG_BIN 5 | } else { 6 | var os = require('os') 7 | var path = require('path') 8 | 9 | var binaries = Object.assign(Object.create(null), { 10 | darwin: ['x64', 'arm64'], 11 | freebsd: ['x64'], 12 | linux: ['x64', 'ia32', 'arm64', 'arm'], 13 | win32: ['x64', 'ia32'] 14 | }) 15 | 16 | var platform = process.env.npm_config_platform || os.platform() 17 | var arch = process.env.npm_config_arch || os.arch() 18 | 19 | var ffmpegPath = path.join( 20 | __dirname, 21 | platform === 'win32' ? 'ffmpeg.exe' : 'ffmpeg' 22 | ) 23 | 24 | if (!binaries[platform] || binaries[platform].indexOf(arch) === -1) { 25 | ffmpegPath = null 26 | } 27 | 28 | module.exports = ffmpegPath 29 | } 30 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const {ok, strictEqual} = require('assert') 4 | const {isAbsolute} = require('path') 5 | const fs = require('fs') 6 | const {spawnSync} = require('child_process') 7 | const shell = require('any-shell-escape') 8 | const ffmpegPath = require('.') 9 | 10 | console.info('TAP version 12') 11 | console.info('1..4') 12 | 13 | ok(isAbsolute(ffmpegPath)) 14 | console.info('ok 1 - ffmpeg path is absolute') 15 | 16 | ok(fs.statSync(ffmpegPath).isFile(ffmpegPath)) 17 | console.info(`ok 2 - ${ffmpegPath} is a file`) 18 | 19 | fs.accessSync(ffmpegPath, fs.constants.X_OK) 20 | console.info(`ok 3 - ${ffmpegPath} is executable`) 21 | 22 | const {status} = spawnSync(ffmpegPath, ['--help'], { 23 | stdio: ['ignore', 'ignore', 'pipe'], // stdin, stdout, stderr 24 | }) 25 | strictEqual(status, 0) 26 | console.info(`ok 4 - \`${ffmpegPath} --help\` works`) 27 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict' 3 | 4 | const {join} = require('path') 5 | const shell = require('any-shell-escape') 6 | const {exec} = require('child_process') 7 | 8 | const argv = process.argv.slice(2) 9 | if (argv.includes('-h') || argv.includes('--help')) { 10 | console.info(` 11 | This is just a simple CLI wrapper around the powerful ffmpeg CLI tool. 12 | This script just showcases how to use ffmpeg-static; It wouldn't make 13 | sense to hide a flexible tool behind a limited wrapper script. 14 | Usage: 15 | ./example.js src-audio-file.m4a dest-audio-file.mp3 16 | `) 17 | process.exit(0) 18 | } 19 | 20 | const [src, dest] = argv 21 | const makeMp3 = shell([ 22 | 'ffmpeg', '-y', '-v', 'error', 23 | '-i', join(process.cwd(), src), 24 | '-acodec', 'mp3', 25 | '-format', 'mp3', 26 | join(process.cwd(), dest) 27 | ]) 28 | 29 | exec(makeMp3, (err) => { 30 | if (err) { 31 | console.error(err) 32 | process.exit(1) 33 | } else { 34 | console.info('done!') 35 | } 36 | }) 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ffmpeg-static", 3 | "version": "4.4.0", 4 | "description": "ffmpeg static binaries for Mac OSX and Linux and Windows", 5 | "main": "index.js", 6 | "files": [ 7 | "index.js", 8 | "install.js", 9 | "example.js" 10 | ], 11 | "scripts": { 12 | "install": "node install.js", 13 | "test": "node test.js", 14 | "lint": "eslint .", 15 | "prepublishOnly": "npm run lint && npm run install && npm test" 16 | }, 17 | "ffmpeg-static": { 18 | "binary-release-tag": "b4.4", 19 | "binary-release-name": "4.4" 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "https://github.com/eugeneware/ffmpeg-static" 24 | }, 25 | "keywords": [ 26 | "ffmpeg", 27 | "static", 28 | "library", 29 | "binary", 30 | "binaries", 31 | "mac", 32 | "linux", 33 | "windows" 34 | ], 35 | "authors": [ 36 | "Eugene Ware ", 37 | "Jannis R " 38 | ], 39 | "contributors": [ 40 | "Thefrank (https://github.com/Thefrank)" 41 | ], 42 | "license": "GPL-3.0-or-later", 43 | "bugs": { 44 | "url": "https://github.com/eugeneware/ffmpeg-static/issues" 45 | }, 46 | "engines": { 47 | "node": ">=10" 48 | }, 49 | "dependencies": { 50 | "@derhuerst/http-basic": "^8.2.0", 51 | "env-paths": "^2.2.0", 52 | "https-proxy-agent": "^5.0.0", 53 | "progress": "^2.0.3" 54 | }, 55 | "devDependencies": { 56 | "any-shell-escape": "^0.1.1", 57 | "eslint": "^7.30.0" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020, Eugene Ware and contributors 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | 2. Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | 3. Neither the name of Eugene Ware nor the names of its contributors 13 | may be used to endorse or promote products derived from this software 14 | without specific prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY EUGENE WARE ''AS IS'' AND ANY 17 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL EUGENE WARE BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ffmpeg-static 2 | 3 | **[ffmpeg](https://ffmpeg.org) static binaries for Mac OSX, Linux, Windows and FreeBSD.** 4 | 5 | Supports macOS (64-bit and arm64), Linux (32 and 64-bit, armhf, arm64), Windows (32 and 64-bit) and FreeBSD (64-bit). [The ffmpeg version currently used is `4.4`.](https://github.com/eugeneware/ffmpeg-static/releases/tag/b4.4) 6 | 7 | *Note:* The version of `ffmpeg-static` follows [SemVer](http://semver.org). When releasing new versions, **we do *not* consider breaking changes in `ffmpeg` itself**, but only the JS interface (see below). To stop `ffmpeg-static` from breaking your code by getting updated, [lock the version down](https://docs.npmjs.com/files/package.json#dependencies) or use a [lockfile](https://docs.npmjs.com/files/package-lock.json). 8 | 9 | [![npm version](https://img.shields.io/npm/v/ffmpeg-static.svg)](https://www.npmjs.com/package/ffmpeg-static) 10 | [![build status](https://travis-ci.org/eugeneware/ffmpeg-static.svg?branch=master)](http://travis-ci.org/eugeneware/ffmpeg-static) 11 | ![minimum Node.js version](https://img.shields.io/node/v/ffmpeg-static.svg) 12 | 13 | ## Installation 14 | 15 | This module is installed via npm: 16 | 17 | ``` bash 18 | $ npm install ffmpeg-static 19 | ``` 20 | 21 | *Note:* During installation, it will download the appropriate `ffmpeg` binary from the [`b4.4` GitHub release](https://github.com/eugeneware/ffmpeg-static/releases/tag/b4.4). Use and distribution of the binary releases of FFmpeg are covered by their respective license. 22 | 23 | ### Electron & other cross-platform packaging tools 24 | 25 | Because `ffmpeg-static` will download a binary specific to the OS/platform, you need to purge `node_modules` before (re-)packaging your app *for a different OS/platform* ([read more in #35](https://github.com/eugeneware/ffmpeg-static/issues/35#issuecomment-630225392)). 26 | 27 | ## Example Usage 28 | 29 | Returns the path of a statically linked ffmpeg binary on the local filesystem. 30 | 31 | ``` js 32 | var pathToFfmpeg = require('ffmpeg-static'); 33 | console.log(pathToFfmpeg); 34 | ``` 35 | 36 | ``` 37 | /Users/j/playground/node_modules/ffmpeg-static/ffmpeg 38 | ``` 39 | 40 | Check the [example script](example.js) for a more thorough example. 41 | 42 | ## Sources of the binaries 43 | 44 | [The build script](build/index.sh) downloads binaries from these locations: 45 | 46 | - [Windows x64 builds](https://github.com/ShareX/FFmpeg/) 47 | - [Windows x86 builds](https://github.com/sudo-nautilus/FFmpeg-Builds-Win32/) 48 | - [Linux builds](https://johnvansickle.com/ffmpeg/) 49 | - macOS builds [for Intel](https://evermeet.cx/pub/ffmpeg/) / [for ARM (Apple Silicon)](https://osxexperts.net/) 50 | - [FreeBSD builds](https://github.com/Thefrank/ffmpeg-static-freebsd/releases) 51 | 52 | The build script extracts build information and (when possible) the license file from the downloaded package or the distribution server. Please consult the individual build's project site for exact source versions, which you can locate based on the version information included in the README file. 53 | 54 | ## Show your support 55 | 56 | This npm package includes statically linked binaries that are produced by the following individuals. Please consider supporting and donating to them who have been providing quality binary builds for many years: 57 | 58 | - **Windows builds**: [Jaex](https://getsharex.com/donate/) 59 | - **Linux builds**: [John Van Sickle](https://www.johnvansickle.com/ffmpeg/) 60 | - **macOS builds**: [Helmut K. C. Tessarek](https://evermeet.cx/ffmpeg/#donations) 61 | 62 | ## Building the project 63 | 64 | The `unzip`, `tar` CLI executables need to be installed. On macOS, use `brew install gnu-tar xz`. 65 | -------------------------------------------------------------------------------- /install.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var fs = require("fs"); 4 | var os = require("os"); 5 | const {encode: encodeQuery} = require('querystring') 6 | const {strictEqual} = require('assert') 7 | const envPaths = require('env-paths') 8 | const FileCache = require('@derhuerst/http-basic/lib/FileCache').default 9 | const {extname} = require('path') 10 | var ProgressBar = require("progress"); 11 | var request = require('@derhuerst/http-basic') 12 | const {createGunzip} = require('zlib') 13 | const {pipeline} = require('stream') 14 | var ffmpegPath = require("."); 15 | var pkg = require("./package"); 16 | 17 | const exitOnError = (err) => { 18 | console.error(err) 19 | process.exit(1) 20 | } 21 | const exitOnErrorOrWarnWith = (msg) => (err) => { 22 | if (err.statusCode === 404) console.warn(msg) 23 | else exitOnError(err) 24 | } 25 | 26 | if (!ffmpegPath) { 27 | exitOnError('ffmpeg-static install failed: No binary found for architecture') 28 | } 29 | 30 | try { 31 | if (fs.statSync(ffmpegPath).isFile()) { 32 | console.info('ffmpeg is installed already.') 33 | process.exit(0) 34 | } 35 | } catch (err) { 36 | if (err && err.code !== 'ENOENT') exitOnError(err) 37 | } 38 | 39 | let agent = false 40 | // https://github.com/request/request/blob/a9557c9e7de2c57d92d9bab68a416a87d255cd3d/lib/getProxyFromURI.js#L66-L71 41 | const proxyUrl = ( 42 | process.env.HTTPS_PROXY || 43 | process.env.https_proxy || 44 | process.env.HTTP_PROXY || 45 | process.env.http_proxy 46 | ) 47 | if (proxyUrl) { 48 | const HttpsProxyAgent = require('https-proxy-agent') 49 | const {hostname, port, protocol} = new URL(proxyUrl) 50 | agent = new HttpsProxyAgent({hostname, port, protocol}) 51 | } 52 | 53 | // https://advancedweb.hu/how-s3-signed-urls-work/ 54 | const normalizeS3Url = (url) => { 55 | url = new URL(url) 56 | if (url.hostname.slice(-17) !== '.s3.amazonaws.com') return url.href 57 | const query = Array.from(url.searchParams.entries()) 58 | .filter(([key]) => key.slice(0, 6).toLowerCase() !== 'x-amz-') 59 | .reduce((query, [key, val]) => ({...query, [key]: val}), {}) 60 | url.search = encodeQuery(query) 61 | return url.href 62 | } 63 | strictEqual( 64 | normalizeS3Url('https://example.org/foo?bar'), 65 | 'https://example.org/foo?bar' 66 | ) 67 | strictEqual( 68 | normalizeS3Url('https://github-production-release-asset-2e65be.s3.amazonaws.com/29458513/26341680-4231-11ea-8e36-ae454621d74a?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20200405%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200405T225358Z&X-Amz-Expires=300&X-Amz-Signature=d6415097af04cf62ea9b69d3c1a421278e96bcb069afa48cf021ec3b6941bae4&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Ddarwin-x64&response-content-type=application%2Foctet-stream'), 69 | 'https://github-production-release-asset-2e65be.s3.amazonaws.com/29458513/26341680-4231-11ea-8e36-ae454621d74a?actor_id=0&response-content-disposition=attachment%3B%20filename%3Ddarwin-x64&response-content-type=application%2Foctet-stream' 70 | ) 71 | 72 | const cache = new FileCache(envPaths(pkg.name).cache) 73 | cache.getCacheKey = (url) => { 74 | return FileCache.prototype.getCacheKey(normalizeS3Url(url)) 75 | } 76 | 77 | const isGzUrl = (url) => { 78 | const path = new URL(url).pathname.split('/') 79 | const filename = path[path.length - 1] 80 | return filename && extname(filename) === '.gz' 81 | } 82 | 83 | const noop = () => {} 84 | function downloadFile(url, destinationPath, progressCallback = noop) { 85 | let fulfill, reject; 86 | let totalBytes = 0; 87 | 88 | const promise = new Promise((x, y) => { 89 | fulfill = x; 90 | reject = y; 91 | }); 92 | 93 | request('GET', url, { 94 | agent, 95 | followRedirects: true, 96 | maxRedirects: 3, 97 | gzip: true, 98 | cache, 99 | timeout: 30 * 1000, // 30s 100 | retry: true, 101 | }, (err, response) => { 102 | if (err || response.statusCode !== 200) { 103 | err = err || new Error('Download failed.') 104 | if (response) { 105 | err.url = response.url 106 | err.statusCode = response.statusCode 107 | } 108 | reject(err) 109 | return; 110 | } 111 | 112 | const file = fs.createWriteStream(destinationPath); 113 | const streams = isGzUrl(url) 114 | ? [response.body, createGunzip(), file] 115 | : [response.body, file] 116 | pipeline( 117 | ...streams, 118 | (err) => { 119 | if (err) { 120 | err.url = response.url 121 | err.statusCode = response.statusCode 122 | reject(err) 123 | } else fulfill() 124 | } 125 | ) 126 | 127 | if (!response.fromCache && progressCallback) { 128 | const cLength = response.headers["content-length"] 129 | totalBytes = cLength ? parseInt(cLength, 10) : null 130 | response.body.on('data', (chunk) => { 131 | progressCallback(chunk.length, totalBytes); 132 | }); 133 | } 134 | }); 135 | 136 | return promise; 137 | } 138 | 139 | let progressBar = null; 140 | function onProgress(deltaBytes, totalBytes) { 141 | if (totalBytes === null) return; 142 | if (!progressBar) { 143 | progressBar = new ProgressBar(`Downloading ffmpeg ${releaseName} [:bar] :percent :etas `, { 144 | complete: "|", 145 | incomplete: " ", 146 | width: 20, 147 | total: totalBytes 148 | }); 149 | } 150 | 151 | progressBar.tick(deltaBytes); 152 | } 153 | 154 | const release = ( 155 | process.env.FFMPEG_BINARY_RELEASE || 156 | pkg['ffmpeg-static']['binary-release-tag'] 157 | ) 158 | const releaseName = ( 159 | pkg['ffmpeg-static']['binary-release-name'] || 160 | release 161 | ) 162 | const arch = process.env.npm_config_arch || os.arch() 163 | const platform = process.env.npm_config_platform || os.platform() 164 | 165 | const baseUrl = `https://github.com/eugeneware/ffmpeg-static/releases/download/${release}` 166 | const downloadUrl = `${baseUrl}/${platform}-${arch}.gz` 167 | const readmeUrl = `${baseUrl}/${platform}-${arch}.README` 168 | const licenseUrl = `${baseUrl}/${platform}-${arch}.LICENSE` 169 | 170 | downloadFile(downloadUrl, ffmpegPath, onProgress) 171 | .then(() => { 172 | fs.chmodSync(ffmpegPath, 0o755) // make executable 173 | }) 174 | .catch(exitOnError) 175 | 176 | .then(() => downloadFile(readmeUrl, `${ffmpegPath}.README`)) 177 | .catch(exitOnErrorOrWarnWith('Failed to download the ffmpeg README.')) 178 | 179 | .then(() => downloadFile(licenseUrl, `${ffmpegPath}.LICENSE`)) 180 | .catch(exitOnErrorOrWarnWith('Failed to download the ffmpeg LICENSE.')) 181 | -------------------------------------------------------------------------------- /.github/workflows/release-binaries.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | tags: 4 | - "b*" 5 | 6 | name: Release Binaries 7 | 8 | jobs: 9 | release: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | 14 | - name: Download Binaries 15 | run: sh ./build/index.sh 16 | 17 | - name: Compress Binaries 18 | run: | 19 | set -e 20 | set -o pipefail 21 | cat bin/darwin-x64 | gzip --best >bin/darwin-x64.gz 22 | cat bin/darwin-arm64 | gzip --best >bin/darwin-arm64.gz 23 | cat bin/freebsd-x64 | gzip --best >bin/freebsd-x64.gz 24 | cat bin/linux-arm | gzip --best >bin/linux-arm.gz 25 | cat bin/linux-arm64 | gzip --best >bin/linux-arm64.gz 26 | cat bin/linux-ia32 | gzip --best >bin/linux-ia32.gz 27 | cat bin/linux-x64 | gzip --best >bin/linux-x64.gz 28 | cat bin/win32-ia32 | gzip --best >bin/win32-ia32.gz 29 | cat bin/win32-x64 | gzip --best >bin/win32-x64.gz 30 | ls -l bin 31 | shell: bash 32 | 33 | - name: Create Release 34 | id: create_release 35 | uses: actions/create-release@v1 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 38 | with: 39 | tag_name: ${{ github.ref }} 40 | release_name: Release ${{ github.ref }} 41 | 42 | - uses: actions/upload-release-asset@v1.0.1 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | with: 46 | upload_url: ${{ steps.create_release.outputs.upload_url }} 47 | asset_path: bin/darwin-x64 48 | asset_name: darwin-x64 49 | asset_content_type: application/octet-stream 50 | - uses: actions/upload-release-asset@v1.0.1 51 | env: 52 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 53 | with: 54 | upload_url: ${{ steps.create_release.outputs.upload_url }} 55 | asset_path: bin/darwin-x64.gz 56 | asset_name: darwin-x64.gz 57 | asset_content_type: application/octet-stream 58 | 59 | - uses: actions/upload-release-asset@v1.0.1 60 | env: 61 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 62 | with: 63 | upload_url: ${{ steps.create_release.outputs.upload_url }} 64 | asset_path: bin/darwin-x64.README 65 | asset_name: darwin-x64.README 66 | asset_content_type: text/plain 67 | 68 | - uses: actions/upload-release-asset@v1.0.1 69 | env: 70 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 71 | with: 72 | upload_url: ${{ steps.create_release.outputs.upload_url }} 73 | asset_path: bin/darwin-arm64 74 | asset_name: darwin-arm64 75 | asset_content_type: application/octet-stream 76 | - uses: actions/upload-release-asset@v1.0.1 77 | env: 78 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 79 | with: 80 | upload_url: ${{ steps.create_release.outputs.upload_url }} 81 | asset_path: bin/darwin-arm64.gz 82 | asset_name: darwin-arm64.gz 83 | asset_content_type: application/octet-stream 84 | 85 | - uses: actions/upload-release-asset@v1.0.1 86 | env: 87 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 88 | with: 89 | upload_url: ${{ steps.create_release.outputs.upload_url }} 90 | asset_path: bin/darwin-arm64.README 91 | asset_name: darwin-arm64.README 92 | asset_content_type: text/plain 93 | 94 | - uses: actions/upload-release-asset@v1.0.1 95 | env: 96 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 97 | with: 98 | upload_url: ${{ steps.create_release.outputs.upload_url }} 99 | asset_path: bin/freebsd-x64 100 | asset_name: freebsd-x64 101 | asset_content_type: application/octet-stream 102 | - uses: actions/upload-release-asset@v1.0.1 103 | env: 104 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 105 | with: 106 | upload_url: ${{ steps.create_release.outputs.upload_url }} 107 | asset_path: bin/freebsd-x64.gz 108 | asset_name: freebsd-x64.gz 109 | asset_content_type: application/octet-stream 110 | 111 | - uses: actions/upload-release-asset@v1.0.1 112 | env: 113 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 114 | with: 115 | upload_url: ${{ steps.create_release.outputs.upload_url }} 116 | asset_path: bin/linux-arm 117 | asset_name: linux-arm 118 | asset_content_type: application/octet-stream 119 | - uses: actions/upload-release-asset@v1.0.1 120 | env: 121 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 122 | with: 123 | upload_url: ${{ steps.create_release.outputs.upload_url }} 124 | asset_path: bin/linux-arm.gz 125 | asset_name: linux-arm.gz 126 | asset_content_type: application/octet-stream 127 | 128 | - uses: actions/upload-release-asset@v1.0.1 129 | env: 130 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 131 | with: 132 | upload_url: ${{ steps.create_release.outputs.upload_url }} 133 | asset_path: bin/linux-arm.README 134 | asset_name: linux-arm.README 135 | asset_content_type: text/plain 136 | 137 | - uses: actions/upload-release-asset@v1.0.1 138 | env: 139 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 140 | with: 141 | upload_url: ${{ steps.create_release.outputs.upload_url }} 142 | asset_path: bin/linux-arm.LICENSE 143 | asset_name: linux-arm.LICENSE 144 | asset_content_type: text/plain 145 | 146 | - uses: actions/upload-release-asset@v1.0.1 147 | env: 148 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 149 | with: 150 | upload_url: ${{ steps.create_release.outputs.upload_url }} 151 | asset_path: bin/linux-arm64 152 | asset_name: linux-arm64 153 | asset_content_type: application/octet-stream 154 | - uses: actions/upload-release-asset@v1.0.1 155 | env: 156 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 157 | with: 158 | upload_url: ${{ steps.create_release.outputs.upload_url }} 159 | asset_path: bin/linux-arm64.gz 160 | asset_name: linux-arm64.gz 161 | asset_content_type: application/octet-stream 162 | 163 | - uses: actions/upload-release-asset@v1.0.1 164 | env: 165 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 166 | with: 167 | upload_url: ${{ steps.create_release.outputs.upload_url }} 168 | asset_path: bin/linux-arm64.README 169 | asset_name: linux-arm64.README 170 | asset_content_type: text/plain 171 | 172 | - uses: actions/upload-release-asset@v1.0.1 173 | env: 174 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 175 | with: 176 | upload_url: ${{ steps.create_release.outputs.upload_url }} 177 | asset_path: bin/linux-arm64.LICENSE 178 | asset_name: linux-arm64.LICENSE 179 | asset_content_type: text/plain 180 | 181 | - uses: actions/upload-release-asset@v1.0.1 182 | env: 183 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 184 | with: 185 | upload_url: ${{ steps.create_release.outputs.upload_url }} 186 | asset_path: bin/linux-ia32 187 | asset_name: linux-ia32 188 | asset_content_type: application/octet-stream 189 | - uses: actions/upload-release-asset@v1.0.1 190 | env: 191 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 192 | with: 193 | upload_url: ${{ steps.create_release.outputs.upload_url }} 194 | asset_path: bin/linux-ia32.gz 195 | asset_name: linux-ia32.gz 196 | asset_content_type: application/octet-stream 197 | 198 | - uses: actions/upload-release-asset@v1.0.1 199 | env: 200 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 201 | with: 202 | upload_url: ${{ steps.create_release.outputs.upload_url }} 203 | asset_path: bin/linux-ia32.README 204 | asset_name: linux-ia32.README 205 | asset_content_type: text/plain 206 | 207 | - uses: actions/upload-release-asset@v1.0.1 208 | env: 209 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 210 | with: 211 | upload_url: ${{ steps.create_release.outputs.upload_url }} 212 | asset_path: bin/linux-ia32.LICENSE 213 | asset_name: linux-ia32.LICENSE 214 | asset_content_type: text/plain 215 | 216 | - uses: actions/upload-release-asset@v1.0.1 217 | env: 218 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 219 | with: 220 | upload_url: ${{ steps.create_release.outputs.upload_url }} 221 | asset_path: bin/linux-x64 222 | asset_name: linux-x64 223 | asset_content_type: application/octet-stream 224 | - uses: actions/upload-release-asset@v1.0.1 225 | env: 226 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 227 | with: 228 | upload_url: ${{ steps.create_release.outputs.upload_url }} 229 | asset_path: bin/linux-x64.gz 230 | asset_name: linux-x64.gz 231 | asset_content_type: application/octet-stream 232 | 233 | - uses: actions/upload-release-asset@v1.0.1 234 | env: 235 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 236 | with: 237 | upload_url: ${{ steps.create_release.outputs.upload_url }} 238 | asset_path: bin/linux-x64.README 239 | asset_name: linux-x64.README 240 | asset_content_type: text/plain 241 | 242 | - uses: actions/upload-release-asset@v1.0.1 243 | env: 244 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 245 | with: 246 | upload_url: ${{ steps.create_release.outputs.upload_url }} 247 | asset_path: bin/linux-x64.LICENSE 248 | asset_name: linux-x64.LICENSE 249 | asset_content_type: text/plain 250 | 251 | - uses: actions/upload-release-asset@v1.0.1 252 | env: 253 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 254 | with: 255 | upload_url: ${{ steps.create_release.outputs.upload_url }} 256 | asset_path: bin/win32-ia32 257 | asset_name: win32-ia32 258 | asset_content_type: application/octet-stream 259 | - uses: actions/upload-release-asset@v1.0.1 260 | env: 261 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 262 | with: 263 | upload_url: ${{ steps.create_release.outputs.upload_url }} 264 | asset_path: bin/win32-ia32.gz 265 | asset_name: win32-ia32.gz 266 | asset_content_type: application/octet-stream 267 | 268 | - uses: actions/upload-release-asset@v1.0.1 269 | env: 270 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 271 | with: 272 | upload_url: ${{ steps.create_release.outputs.upload_url }} 273 | asset_path: bin/win32-ia32.LICENSE 274 | asset_name: win32-ia32.LICENSE 275 | asset_content_type: text/plain 276 | 277 | - uses: actions/upload-release-asset@v1.0.1 278 | env: 279 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 280 | with: 281 | upload_url: ${{ steps.create_release.outputs.upload_url }} 282 | asset_path: bin/win32-x64 283 | asset_name: win32-x64 284 | asset_content_type: application/octet-stream 285 | - uses: actions/upload-release-asset@v1.0.1 286 | env: 287 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 288 | with: 289 | upload_url: ${{ steps.create_release.outputs.upload_url }} 290 | asset_path: bin/win32-x64.gz 291 | asset_name: win32-x64.gz 292 | asset_content_type: application/octet-stream 293 | 294 | - uses: actions/upload-release-asset@v1.0.1 295 | env: 296 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 297 | with: 298 | upload_url: ${{ steps.create_release.outputs.upload_url }} 299 | asset_path: bin/win32-x64.LICENSE 300 | asset_name: win32-x64.LICENSE 301 | asset_content_type: text/plain 302 | --------------------------------------------------------------------------------