forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			215 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			215 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Sheets in a Box with boxednode
							 | 
						|||
| 
								 | 
							
								sidebar_label: boxednode
							 | 
						|||
| 
								 | 
							
								pagination_prev: demos/desktop/index
							 | 
						|||
| 
								 | 
							
								pagination_next: demos/data/index
							 | 
						|||
| 
								 | 
							
								sidebar_custom_props:
							 | 
						|||
| 
								 | 
							
								  summary: NodeJS binaries with scripts, built from source
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								import current from '/version.js';
							 | 
						|||
| 
								 | 
							
								import Tabs from '@theme/Tabs';
							 | 
						|||
| 
								 | 
							
								import TabItem from '@theme/TabItem';
							 | 
						|||
| 
								 | 
							
								import CodeBlock from '@theme/CodeBlock';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								export const r = {style: {color:"red"}};
							 | 
						|||
| 
								 | 
							
								export const B = {style: {fontWeight:"bold"}};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								`boxednode`[^1] is a tool for generating command-line tools that embed scripts.
							 | 
						|||
| 
								 | 
							
								It automates the process of building NodeJS from source.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
							 | 
						|||
| 
								 | 
							
								data from spreadsheets.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								This demo uses `boxednode` and SheetJS to create a standalone CLI tool for
							 | 
						|||
| 
								 | 
							
								parsing spreadsheets and converting to other formats.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::note Tested Deployments
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								This demo was tested in the following deployments:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								| Architecture | Version | NodeJS    | Date       |
							 | 
						|||
| 
								 | 
							
								|:-------------|:--------|:----------|:-----------|
							 | 
						|||
| 
								 | 
							
								| `darwin-x64` | `2.4.0` | `22.2.0`  | 2024-05-28 |
							 | 
						|||
| 
								 | 
							
								| `darwin-arm` | `2.4.3` | `22.2.0`  | 2024-05-25 |
							 | 
						|||
| 
								 | 
							
								| `win10-x64`  | `2.4.2` | `16.20.2` | 2024-04-18 |
							 | 
						|||
| 
								 | 
							
								| `linux-x64`  | `2.4.0` | `21.7.1`  | 2024-03-21 |
							 | 
						|||
| 
								 | 
							
								| `linux-arm`  | `2.4.3` | `20.13.1` | 2024-05-26 |
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Integration Details
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								The [SheetJS NodeJS module](/docs/getting-started/installation/nodejs) can be
							 | 
						|||
| 
								 | 
							
								required from scripts. `boxednode` will automatically handle packaging.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Script Requirements
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Scripts that exclusively use SheetJS libraries and NodeJS built-in modules can
							 | 
						|||
| 
								 | 
							
								be bundled using `boxednode`
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								The demo script [`xlsx-cli.js`](pathname:///cli/xlsx-cli.js) runs in NodeJS. It
							 | 
						|||
| 
								 | 
							
								is a simple command-line tool for reading and writing spreadsheets.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Complete Example
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								0) Download the test file https://docs.sheetjs.com/pres.numbers:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								curl -o pres.numbers https://docs.sheetjs.com/pres.numbers
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								1) Download [`xlsx-cli.js`](pathname:///cli/xlsx-cli.js)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								curl -o xlsx-cli.js https://docs.sheetjs.com/cli/xlsx-cli.js
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								2) Install the dependencies:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								<Tabs groupId="pm">
							 | 
						|||
| 
								 | 
							
								  <TabItem value="npm" label="npm">
							 | 
						|||
| 
								 | 
							
								<CodeBlock language="bash">{`\
							 | 
						|||
| 
								 | 
							
								npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz exit-on-epipe commander@2`}
							 | 
						|||
| 
								 | 
							
								</CodeBlock>
							 | 
						|||
| 
								 | 
							
								  </TabItem>
							 | 
						|||
| 
								 | 
							
								  <TabItem value="pnpm" label="pnpm">
							 | 
						|||
| 
								 | 
							
								<CodeBlock language="bash">{`\
							 | 
						|||
| 
								 | 
							
								pnpm install --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz exit-on-epipe commander@2`}
							 | 
						|||
| 
								 | 
							
								</CodeBlock>
							 | 
						|||
| 
								 | 
							
								  </TabItem>
							 | 
						|||
| 
								 | 
							
								  <TabItem value="yarn" label="Yarn" default>
							 | 
						|||
| 
								 | 
							
								<CodeBlock language="bash">{`\
							 | 
						|||
| 
								 | 
							
								yarn add https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz exit-on-epipe commander@2`}
							 | 
						|||
| 
								 | 
							
								</CodeBlock>
							 | 
						|||
| 
								 | 
							
								  </TabItem>
							 | 
						|||
| 
								 | 
							
								</Tabs>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								3) Create the standalone program:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								<Tabs groupId="os">
							 | 
						|||
| 
								 | 
							
								  <TabItem value="unix" label="Linux/MacOS">
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								npx boxednode@2.4.3 -s xlsx-cli.js -t xlsx-cli
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::caution pass
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								When this demo was last tested in `linux-arm`, the build failed with an error:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								<pre>
							 | 
						|||
| 
								 | 
							
								../deps/v8/src/base/small-vector.h:  In instantiation of <span {...B}>‘class v8::base::SmallVector<std::pair<const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex>, 16>’</span>:
							 | 
						|||
| 
								 | 
							
								<span {...B}>../deps/v8/src/compiler/turboshaft/loop-unrolling-reducer.h:444:11:</span>   required from here
							 | 
						|||
| 
								 | 
							
								<span {...B}>../deps/v8/src/base/macros.h:206:55:</span> <span style={{...r.style,...B.style}}>error:</span> static assertion failed: T should be trivially copyable
							 | 
						|||
| 
								 | 
							
								{"  206 |"}   static_assert(::v8::base::is_trivially_copyable<T>::<span style={{...r.style,...B.style}}>value</span>, \\
							 | 
						|||
| 
								 | 
							
								{"      |"}                                                       ^~~~~
							 | 
						|||
| 
								 | 
							
								</pre>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								This affects NodeJS `22.2.0`, but does not affect `20.13.1`. It affects the
							 | 
						|||
| 
								 | 
							
								[V8 JavaScript Engine](/docs/demos/engines/v8#build-v8).
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								The `-n` flag controls the target NodeJS version. For this demo, the following
							 | 
						|||
| 
								 | 
							
								command uses NodeJS `20.13.1`:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								npx boxednode@2.4.3 -s xlsx-cli.js -t xlsx-cli -n 20.13.1
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  </TabItem>
							 | 
						|||
| 
								 | 
							
								  <TabItem value="win" label="Windows">
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								npx boxednode@2.4.3 -s xlsx-cli.js -t xlsx-cli.exe -n 16.20.2
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::info pass
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								The Windows 10 build requires Visual Studio with "Desktop development with C++"
							 | 
						|||
| 
								 | 
							
								workload, Python 3.11, and NASM[^2].
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								**The build command must be run in "x64 Native Tools Command Prompt"**
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::caution pass
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								When the demo was last tested, the build failed:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								Not an executable Python program
							 | 
						|||
| 
								 | 
							
								Could not find Python.
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								By default, Windows aliases `python` to a Microsoft Store installer. If the
							 | 
						|||
| 
								 | 
							
								official installer was used, the alias should be disabled manually:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								1) Open Start menu and type "app alias". Click "Manage app execution aliases".
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								2) Disable the App Installer for all items with `python` in the name.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Using Python 3.12, the build fails with an error:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								Please use python3.11 or python3.10 or python3.9 or python3.8 or python3.7 or python3.6.
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								In the most recent test, Python 3.11.8 was installed from the official site.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::caution pass
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								When the demo was last tested on Windows, the build failed:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								error MSB8020: The build tools for Visual Studio 2019 (Platform Toolset = 'v142') cannot be found. To build using the v142 build tools, please install Visual Studio 2019 build tools.
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								This error was fixed by installing the `v142` build tools through the Visual
							 | 
						|||
| 
								 | 
							
								Studio installer.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::caution pass
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								In the most recent Windows test against NodeJS `20.8.0`, the build failed due
							 | 
						|||
| 
								 | 
							
								to an issue in the OpenSSL dependency:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								...\node-v20.8.0\deps\openssl\openssl\crypto\cversion.c(75,33): error C2153: integer literals must have at least one digit [...\node-v20.8.0\deps\openssl\openssl.vcxproj]
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								SheetJS libraries are compatible with NodeJS versions dating back to `v0.8`. The
							 | 
						|||
| 
								 | 
							
								workaround is to select NodeJS `v16.20.2` using the `-n` flag. This version was
							 | 
						|||
| 
								 | 
							
								was chosen since NodeJS `v18` upgraded the OpenSSL dependency.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								:::
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  </TabItem>
							 | 
						|||
| 
								 | 
							
								</Tabs>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								4) Run the generated program, passing `pres.numbers` as the argument:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								<Tabs groupId="os">
							 | 
						|||
| 
								 | 
							
								  <TabItem value="unix" label="Linux/MacOS">
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								./xlsx-cli pres.numbers
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  </TabItem>
							 | 
						|||
| 
								 | 
							
								  <TabItem value="win" label="Windows">
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```powershell
							 | 
						|||
| 
								 | 
							
								.\xlsx-cli.exe pres.numbers
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  </TabItem>
							 | 
						|||
| 
								 | 
							
								</Tabs>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								[^1]: The project does not have a website. The [source repository](https://github.com/mongodb-js/boxednode) is publicly available.
							 | 
						|||
| 
								 | 
							
								[^2]: Downloads can be found [at the main NASM project website](https://www.nasm.us/)
							 |