CINXE.COM

Node apps | Snapcraft documentation

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> Node apps | Snapcraft documentation</title> <!-- Preconnect to establish early connections to important third-party origins --> <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://assets.ubuntu.com"> <link rel="preconnect" href="https://munchkin.marketo.net"> <link rel="preload" href="https://assets.ubuntu.com/v1/9689339a-snapcraft-hero-background--light.png" as="image"> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-KCGXHQS');</script> <!-- End Google Tag Manager --> <link rel="stylesheet" href="/static/css/styles.css?v=9838aec" /> <script src="/static/js/modules/raven.min.js?v=daf037c" defer></script> <script> window.addEventListener("DOMContentLoaded", function() { Raven.config('https://1e82fd54e08142c9978f623cb746b965@sentry.is.canonical.com//3', { whitelistUrls: ['staging.snapcraft.io/static/js', 'snapcraft.io/static/js/'], ignoreUrls: ['staging.snapcraft.io/static/js/modules', 'snapcraft.io/static/js/modules'], ignoreErrors: ['AbortError'], release: 'commit_id', environment: 'production' }).install(); }); </script> <script src="/static/js/dist/base.js?v=df18d39" defer></script> <script src="https://assets.ubuntu.com/v1/703e23c9-lazysizes+noscript+native-loading.5.1.2.min.js" defer></script> <meta name="description" content="Snaps are containerised software packages that are simple to create and install. They auto-update and are safe to run. And because they bundle their dependencies, they work on all major Linux systems without modification."> <meta name="copydoc" content=""> <meta name="google-site-verification" content="Y1JayrP2iS6jS6Rd7uGX3Kzgm0oD8rV5R6TkzteLbQg" /> <meta property="og:title" content=" Node apps | Snapcraft documentation"/> <meta property="og:site_name" content="Snapcraft"/> <meta property="og:type" content="website"/> <meta property="og:description" content="Snaps are containerised software packages that are simple to create and install. They auto-update and are safe to run. And because they bundle their dependencies, they work on all major Linux systems without modification."/> <meta property="og:image" content="https://assets.ubuntu.com/v1/4726d040-Snap+logo+white+bg.jpg" /> <meta property="og:image:width" content="1200" /> <meta property="og:image:height" content="630" /> <meta property="og:image:alt" content="Snapcraft banner" /> <meta property="og:url" content="https://snapcraft.io/docs/node-apps" /> <meta property="twitter:card" content="summary_large_image" /> <meta property="twitter:site" content="@snapcraftio" /> <meta property="twitter:creator" content="@snapcraftio" /> <meta property="twitter:image" content="https://assets.ubuntu.com/v1/4726d040-Snap+logo+white+bg.jpg" /> <meta property="twitter:url" content="https://snapcraft.io/docs/node-apps" /> <link rel="canonical" href="https://snapcraft.io/docs/node-apps" /> <link rel="icon" type="image/png" href="https://assets.ubuntu.com/v1/d4ca039f-favicon_16px.png" sizes="16x16" /> <link rel="icon" type="image/png" href="https://assets.ubuntu.com/v1/841d0bcf-favicon_32px.png" sizes="32x32" /> <link rel="icon" type="image/png" href="/static/snapcraft-favicon.png?v=055e94b" sizes="144x144" /> <link rel="author" href="/humans.txt" /> </head> <body class="l-site"> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KCGXHQS" height="0" width="0" style="display: none; visibility: hidden;"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <div class="l-docs is-paper"> <div class="l-docs__header"> <header id="navigation" class="p-navigation is-dark"> <div class="l-docs__subgrid"> <div class="l-docs__sidebar"> <div class="p-navigation__banner"> <div class="p-navigation__tagged-logo"> <a class="p-navigation__link" href="/"> <div class="p-navigation__logo-tag"> <img class="p-navigation__logo-icon" src="https://assets.ubuntu.com/v1/11ff571b-snapcraft.svg" alt=""> </div> <span class="p-navigation__logo-title" style="font-size: 20px;">Canonical Snapcraft</span> </a> </div> <a href="#navigation" class="p-navigation__toggle--open" title="menu">Menu</a> <a href="#navigation-closed" class="p-navigation__toggle--close" title="close menu">Close menu</a> </div> </div> <div class="l-docs__main"> <div class="p-navigation__row u-fixed-width"> <nav class="p-navigation__nav"> <ul class="p-navigation__items" role="menu"> <li class="p-navigation__item " role="menuitem" > <a class="p-navigation__link" href="/store"> Snap Store </a> </li> <li class="p-navigation__item " role="menuitem" > <a class="p-navigation__link" href="/about"> About <span class="u-hide--large">Snapcraft</span> </a> </li> <li class="p-navigation__item--dropdown-toggle " id="learn-link" role="menuitem" > <a class="p-navigation__link" href="#learn-menu" aria-controls="learn-menu"> Learn </a> <ul class="p-navigation__dropdown" id="learn-menu" aria-hidden="true"> <li> <a class="p-navigation__dropdown-item" href="/blog"> Blog </a> </li> <li> <a class="p-navigation__dropdown-item" href="/build"> Build </a> </li> <li> <a class="p-navigation__dropdown-item" href="/docs/"> Docs </a> </li> <li> <a class="p-navigation__dropdown-item" href="/docs/snap-tutorials"> Tutorials </a> </li> </ul> </li> <li class="p-navigation__item " role="menuitem" > <a class="p-navigation__link" href="/iot"> IoT </a> </li> <li class="p-navigation__item" role="menuitem"> <a class="p-navigation__link " href="https://forum.snapcraft.io/">Forum</a> </li> </ul> <ul class="p-navigation__items js-nav-account global-nav" role="menu"> <li class="p-navigation__item--dropdown-toggle js-nav-account--authenticated u-hide" role="menuitem" id="link-1"> <a class="p-navigation__link js-account--name" aria-controls="account-menu" aria-expanded="false"> My account </a> <ul class="p-navigation__dropdown--right" id="account-menu" aria-hidden="true"> <li> <a href="/account/snaps" class="p-navigation__dropdown-item">My published snaps</a> </li> <li class="js-nav-account--validation-sets u-hide"> <a href="/validation-sets" class="p-navigation__dropdown-item">My validation sets</a> </li> <li class="js-nav-account--stores u-hide"> <a href="/admin" class="p-navigation__dropdown-item">My stores</a> </li> <li> <a href="/admin/account" class="p-navigation__dropdown-item">Account details</a> </li> <li> <a href="/logout" class="p-navigation__dropdown-item">Sign out</a> </li> </ul> </li> <li class="p-navigation__item js-nav-account--notauthenticated u-hide" role="menuitem"> <a class="p-navigation__link" href="/snaps"> Sign in <i class="p-icon--user is-light"></i> </a> </li> </ul> </nav> </div> </div> </header> <section id="search-docs" class="p-strip is-bordered is-shallow l-docs__subgrid"> <div class="l-docs__sidebar u-hide--medium u-hide--small"></div> <div class="l-docs__main"> <div class="row"> <form class="p-search-box u-no-margin--bottom" action="/docs/search"> <input type="search" class="p-search-box__input" name="q" placeholder="Search documentation" required/> <button type="reset" class="p-search-box__reset" alt="reset"><i class="p-icon--close">Close</i></button> <button type="submit" class="p-search-box__button" alt="search"><i class="p-icon--search">Search</i></button> </form> </div> </div> </section> </div> <aside class="l-docs__sidebar"> <nav data-js="navigation" class="p-side-navigation" id="default"> <div class="u-hide--large p-strip is-shallow"> <div class="u-fixed-width"> <a href="#default" class="p-side-navigation__toggle js-drawer-toggle" aria-controls="default"> Toggle side navigation </a> </div> </div> <div class="p-side-navigation__overlay js-drawer-toggle" aria-controls="default"></div> <div class="p-side-navigation__drawer" style="margin-top: 0.5rem"> <div class="p-side-navigation__drawer-header"> <a href="#" class="p-side-navigation__toggle--in-drawer js-drawer-toggle" aria-controls="default"> Toggle side navigation </a> </div> <h3 class="p-side-navigation__heading--linked"> <a class="p-side-navigation__link" href="https://snapcraft.io/docs/" > Snap documentation </a> </h3> <ul class="p-side-navigation__list"> </ul> <h3 class="p-side-navigation__heading--linked"> <a class="p-side-navigation__link" href="/docs" > Using snaps </a> </h3> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snap-tutorials" aria-expanded="false" >Snap tutorials</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Snap tutorials"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/get-started" >Get started</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/installing-snapd" aria-expanded="false" >Install the daemon</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Install the daemon"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-almalinux" >AlmaLinux OS</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-arch-linux" >Arch Linux</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-debian" >Debian</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-elementary-os" >Elementary OS</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-fedora" >Fedora</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-linux-mint" >Linux Mint</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-manjaro-linux" >Manjaro Linux</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-raspbian" >Raspberry Pi OS</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-opensuse" >openSUSE</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-pop" >Pop!_OS</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-rocky" >Rocky Linux</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/installing-snap-on-ubuntu" >Ubuntu</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snap-howto" aria-expanded="false" >Snap how-to guides</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Snap how-to guides"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >Work with snaps</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Work with snaps"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/managing-updates" >Manage updates</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/interface-management" >Connect interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/configuration-in-snaps" >Configure snaps</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/commands-and-aliases" >Apps and aliases</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >Manage snaps</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Manage snaps"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapshots" >Create data snapshots</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/quota-groups" >Use resource quotas</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/disk-space-awareness" >Disk space awareness</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/set-system-options" >Set system options</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/service-management" >Control services</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/using-components" >Using components</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/validation-sets" >Validation sets</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snap-deltas" >Snap deltas</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/using-the-api" >Use the REST API</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/fix-common-issues" aria-expanded="false" >Fix common issues</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Fix common issues"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapd-testing" >Test snapd fixes</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/debug-snaps" >Debug snaps</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snap-reference" aria-expanded="false" >Snap reference</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Snap reference"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >Operations</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Operations"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/glossary" >Glossary</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/system-options" >System options</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/system-architecture" >System architecture</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/supported-interfaces" aria-expanded="false" >Interfaces</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Interfaces"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/hardware-io-interfaces" >Hardware interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/media-interfaces" >Media interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/network-interfaces" >Network interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/security-interfaces" >Security interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/system-interfaces" >System interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/super-privileged-interfaces" >Super-privileged interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >Administration</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Administration"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/network-requirements" >Network requirements</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/distro-support" >Distribution support</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >Development</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Development"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/environment-variables" >Environment variables</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >REST API</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for REST API"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapd-api" >snapd REST API</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapd-error-codes" >Error responses</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >YAML schemas</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for YAML schemas"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/the-snap-format" >The snap format</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/the-gadget-snap" >The gadget snap</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/the-kernel-snap" >The kernel snap</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/release-notes" >Release notes</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snap-explanation" aria-expanded="false" >Snap explanation</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Snap explanation"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >How snaps work</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for How snaps work"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/refresh-awareness" >Refresh awareness</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/channels" >Channels and tracks</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/revisions" >Revisions</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/transactional-updates" >Transactional updates</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/components" >Snap components</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snap-performance" >Snap performance</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >Interfaces</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Interfaces"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/interfaces" >All about interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/auto-connection-mechanism" >Interface auto-connection</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/interface-hooks" >Interface hooks</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >Security</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Security"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/security-policies" >Security policies</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snap-confinement" >Snap confinement</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/assertions" >Assertions</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapd-release-process" >Snapd release process</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> </ul> </li> </ul> <h3 class="p-side-navigation__heading--linked"> <a class="p-side-navigation__link" href="/docs/snapcraft" > Snapcraft build-tool </a> </h3> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snapcraft-tutorials" aria-expanded="false" >Snapcraft tutorials</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Snapcraft tutorials"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/create-a-new-snap" >Create a new snap</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snapcraft-howto" aria-expanded="false" >Snapcraft how-to guides</a> <button class="p-side-navigation__expand" aria-expanded="true" aria-label="show submenu for Snapcraft how-to guides"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-overview" >Snapcraft overview</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snapcraft-quickstart" aria-expanded="true" >Quickstart</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Quickstart"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-setup" >Installation and setup</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/how-snapcraft-builds" >How snapcraft builds a snap</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-basic-example" >Basic snapcraft.yaml example</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-intermediate-example" >Intermediate snapcraft.yaml example</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-build-example" >Build and publishing example</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="true" >Create a snap</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Create a snap"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-checklist" >Build a checklist</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/creating-snapcraft-yaml" >Start snapcraft.yaml</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/adding-global-metadata" >Add global metadata</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/adding-parts" >Build apps with parts</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-extensions" >Use extensions</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/build-and-staging-dependencies" >Add dependencies</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/architectures" >Platforms and architectures</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/defining-a-command" >Define a command</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/services-and-daemons" >Define a service</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-interfaces" >Add interfaces</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/adding-snap-configuration" >Add configuration options</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/using-external-metadata" >Use external metadata</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snap-layouts" >Map files with layouts</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapshots-exclude" >Exclude data from snapshots</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/desktop-menu-support" >Add desktop menu support</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/remote-build" >Build snaps remotely</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/linters-classic" >Linting classic snaps</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/linters-library" >Linting libraries</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/iterating-over-a-build" >Iterate over a build</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/troubleshoot-snap-building" >Troubleshoot snap building</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/using-craftctl" >Using craftctl</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/how-to-classic" >Classic confinement</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/creating-a-snap" aria-expanded="true" >Craft a snap</a> <button class="p-side-navigation__expand" aria-expanded="true" aria-label="show submenu for Craft a snap"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/pre-built-apps" >Example pre-built app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/python-apps" >Example Python app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/c-c-applications" >Example C or C++ app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/java-applications" >Example Java app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/go-applications" >Example Go app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/rust-applications" >Example Rust app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/node-apps" aria-current="page" >Example Node app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ruby-applications" >Example Ruby app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/gtk4-applications" >Example GTK4 app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/gtk3-applications" >Example GTK3 app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/gtk2-applications" >Example GTK2 app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/qt5-kde-applications" >Example Qt5 KDE app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/flutter-applications" >Example Flutter app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/electron-apps" >Example Electron app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/dotnet-apps" >Example .NET app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/moos-applications" >Example MOOS app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-applications" >Example ROS 2 app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros-applications" >Example ROS 1 app</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/creating-a-snap" >Other platforms</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="true" >Publish a snap</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Publish a snap"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/releasing-your-app" >Upload your snap</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/using-the-snap-store" >Access the Snap Store</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/store-listing-branding" >Create a Store listing</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/publish-to-a-branch" >Publish to a branch</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/progressive-releases" >Progressive releases</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/release-management" >Manage releases</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/upload-deltas" >Upload deltas</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-authentication" >Snapcraft authentication</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snap-store-metrics" >View usage metrics</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snap-epochs" >Control data with epochs</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/build-private-repository" >Build from a private repository</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/build-private-repository-workflow" >GitHub workflow from a private repository</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/using-gdb-gdbserver" >Use gdb and gdbserver</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/robotics" aria-expanded="true" >Robotics</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Robotics"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros-applications" >ROS quickstart</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-applications" >ROS2 quickstart</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros-with-github-actions" >Build with GitHub Actions</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-shared-memory-in-snaps" >Access shared memory</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros-distributions-with-no-extensions" >ROS with no extensions</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/cross-compile-an-autotools-project" >Cross-compile an autotools project</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snapcraft-reference" aria-expanded="false" >Snapcraft reference</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Snapcraft reference"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/build-configuration" aria-expanded="false" >Build configuration</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Build configuration"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-yaml-schema" >snapcraft.yaml schema</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/supported-plugins" aria-expanded="false" >Supported plugins</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Supported plugins"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >core24</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for core24"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/autotools-plugin#heading--core22" >Autotools</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ant-plugin#heading--core22" >Ant</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/cmake-plugin#heading--core22" >CMake</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/colcon-plugin#heading--core22" >Colcon</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/conda-plugin#heading--core22" >Conda</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/dump-plugin#heading--core22" >Dump</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/flutter-plugin#heading--core22" >Flutter</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/go-plugin#heading--core22" >Golang</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/make-plugin#heading--core22" >Make</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/matter-sdk-plugin" >Matter-SDK</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/maven-plugin#heading--core22" >Maven</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/meson-plugin#heading--core22" >Meson</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/nil-plugin#heading--core22" >Nil</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/npm-plugin#heading--core22" >NPM</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/python-plugin#heading--core22" >Python</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/rust-plugin#heading--core22" >Rust</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/scons-plugin#heading--core22" >Scons</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >core22</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for core22"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/dotnet-plugin" >.NET/dotnet</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ant-plugin#heading--core22" >Ant</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/autotools-plugin#heading--core22" >Autotools</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/cmake-plugin#heading--core22" >CMake</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/colcon-plugin#heading--core22" >Colcon</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/conda-plugin#heading--core22" >Conda</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/crystal-plugin#heading--core22" >Crystal</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/dump-plugin#heading--core22" >Dump</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/flutter-plugin#heading--core22" >Flutter</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/go-plugin#heading--core22" >Golang</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/make-plugin#heading--core22" >Make</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/matter-sdk-plugin" >Matter-SDK</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/maven-plugin#heading--core22" >Maven</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/meson-plugin#heading--core22" >Meson</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/nil-plugin#heading--core22" >Nil</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/npm-plugin#heading--core22" >NPM</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/python-plugin#heading--core22" >Python</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/rust-plugin#heading--core22" >Rust</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/scons-plugin#heading--core22" >Scons</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >core20</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for core20"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ant-plugin#heading--core20" >Ant</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/autotools-plugin#heading--core20" >Autotools</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/catkin-tools-plugin#heading--core20" >Catkin tools</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/catkin-plugin#heading--core20" >Catkin plugin</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/cmake-plugin#heading--core20" >CMake</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/colcon-plugin#heading--core20" >Colcon</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/conda-plugin#heading--core20" >Conda</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/crystal-plugin#heading--core20" >Crystal</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/dump-plugin#heading--core20" >Dump</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/go-plugin#heading--core20" >Golang</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/npm-plugin#heading--core20" >NPM</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/meson-plugin#heading--core20" >Meson</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/nil-plugin#heading--core20" >Nil</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/python-plugin#heading--core20" >Python</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/qmake-plugin#heading--core20" >Qmake</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/rust-plugin#heading--core20" >Rust</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >core18</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for core18"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/dotnet-plugin#heading--core18" >.NET/dotnet</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ant-plugin#heading--core18" >Ant</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ament-plugin#heading--core18" >Ament</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/autotools-plugin#heading--core18" >Autotools</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/catkin-tools-plugin#heading--core18" >Catkin tools</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/catkin-plugin#heading--core18" >Catkin plugin</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/cmake-plugin#heading--core18" >CMake</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/conda-plugin#heading--core18" >Conda</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/crystal-plugin#heading--core18" >Crystal</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/flutter-plugin#heading--core18" >Flutter</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/go-plugin#heading--core20" >Golang</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/godeps-plugin" >Godeps</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/gradle-plugin" >Gradle</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/gulp-plugin" >Gulp</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/kbuild-plugin" >KBuild</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/kernel-plugin" >Kernel</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/make-plugin#heading--core18" >Make</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/maven-plugin#heading--core18" >Maven</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/meson-plugin#heading--core18" >Meson</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/nodejs-plugin" >Node.js</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ruby-plugin" >Ruby</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/rust-plugin#heading--core18" >Rust</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/python-plugin#heading--core18" >Python</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/qmake-plugin#heading--core18" >Qmake</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/scons-plugin#heading--core18" >Scons</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/waf-plugin" >WAF</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/supported-extensions" aria-expanded="false" >Extensions</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Extensions"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/env-injector" >env-injector</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/kde-neon-extension" >Qt5 and KDE Frameworks</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/flutter-extension" >Flutter</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros-noetic" >ROS 1 Noetic</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros-noetic-content-extension" >ROS 1 Noetic Content Sharing</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-foxy-extension" >ROS2 Foxy</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-foxy-content-extension" >ROS2 Foxy Content Sharing</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-humble-extension" >ROS2 Humble</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-humble-content-extension" >ROS2 Humble Content Sharing</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-jazzy-extension" >ROS2 Jazzy</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros2-jazzy-content-extension" >ROS2 Jazzy Content Sharing</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/gnome-extension" >GNOME</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/parts-environment-variables" >Environment variables</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/package-repositories" >Package repositories</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/reference-architectures" >Platforms and architectures</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/build-options" >Build options</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/build-providers" >Build providers</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/linters" >Snapcraft linters</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/classic-confinement" >Classic confinement</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-release-notes" >Release notes</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/snapcraft-explanation" aria-expanded="false" >Snapcraft explanation</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Snapcraft explanation"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/parts-lifecycle" >Parts lifecycle</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/explanation-architectures" >Architectures</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/snapcraft-advanced-grammar" >Advanced grammar</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link is-expandable" href="/docs/migrating-bases" aria-expanded="false" >Migrate between bases</a> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Migrate between bases"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/migrate-core24" >Migrate to core24</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/migrate-core22" >Migrate to core22</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/supported-snap-hooks" >Hooks</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/using-snapctl" >Using snapctl</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <strong class="p-side-navigation__text is-expandable" aria-expanded="false" >Robotics</strong> <button class="p-side-navigation__expand" aria-expanded="false" aria-label="show submenu for Robotics"></button> <ul class="p-side-navigation__list"> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros-troubleshooting" >ROS troubleshooting</a> <ul class="p-side-navigation__list"> </ul> </li> <li class="p-side-navigation__item"> <a class="p-side-navigation__link " href="/docs/ros-architectures-with-snaps" >ROS architectures</a> <ul class="p-side-navigation__list"> </ul> </li> </ul> </li> </ul> </li> </ul> <h3 class="p-side-navigation__heading--linked"> <a class="p-side-navigation__link" href="/docs/contribute-to-docs" > Contribute to our docs </a> </h3> <ul class="p-side-navigation__list"> </ul> </div> </nav> </aside> <div class="l-docs__title" id="main-content"> <div class="p-section--shallow"> <div class="row"> <div class="col-12"> <h1>Node apps</h1> </div> </div> </div> </div> <div class="l-docs__meta"> <div class="l-docs__sticky-container"> <aside class="p-table-of-contents"> <div class="p-table-of-contents__section"> <h4 class="p-table-of-contents__header">On this page</h4> <nav class="p-table-of-contents__nav" aria-label="Table of contents"> <ul class="p-table-of-contents__list"> <li class="p-table-of-contents__item"> <a class="p-table-of-contents__link" href="#p-31266-why-are-snaps-good-for-nodejs-projects">Why are snaps good for Node.js projects?</a> </li> <li class="p-table-of-contents__item"> <a class="p-table-of-contents__link" href="#p-31266-build-a-snap-in-20-minutes">Build a snap in 20 minutes</a> </li> <li class="p-table-of-contents__item"> <a class="p-table-of-contents__link" href="#p-31266-getting-started">Getting started</a> </li> <ul class="p-table-of-contents__list"> <li class="p-table-of-contents__item"><a class="p-table-of-contents__link" href="#p-31266-building-the-snap">Building the snap</a></li> </ul> <li class="p-table-of-contents__item"> <a class="p-table-of-contents__link" href="#p-31266-publishing-your-snap">Publishing your snap</a> </li> <ul class="p-table-of-contents__list"> <li class="p-table-of-contents__item"><a class="p-table-of-contents__link" href="#p-31266-reserve-a-name-for-your-snap">Reserve a name for your snap</a></li> <li class="p-table-of-contents__item"><a class="p-table-of-contents__link" href="#p-31266-upload-your-snap">Upload your snap</a></li> </ul> </ul> </nav> </div> </aside> </div> </div> <main class="l-docs__main" id="main-content"> <div class="row"> <div class="col-12"> <p><em>Node.js</em> has the <code>package.json</code> format and <em>npm</em> or <em>yarn</em> to assist in packaging and distributing applications to other developers. But these are not user-oriented tools. Nor do they offer a solution for notifying users of available updates.</p> <p>Snaps address these gaps while building upon the work you’ve already done to teach Node how to package your app.</p> <h3><a class="p-link--anchor-heading" href="#p-31266-why-are-snaps-good-for-nodejs-projects" name="p-31266-why-are-snaps-good-for-nodejs-projects">Why are snaps good for Node.js projects?</a></h3> <ul> <li><strong>Snaps are easy to discover and install</strong> Millions of users can browse and install snaps graphically in the Snap Store or from the command-line.</li> <li><strong>Snaps install and run the same across Linux</strong> They bundle the exact version of whatever is required, along with all of your app’s dependencies, be they modules or system libraries.</li> <li><strong>Snaps automatically update to the latest version</strong> Four times a day, users’ systems will check for new versions and upgrade in the background.</li> <li><strong>Upgrades are not disruptive</strong> Because upgrades are not in-place, users can keep your app open as it’s upgraded in the background.</li> <li><strong>Upgrades are safe</strong> If your app fails to upgrade, users automatically roll back to the previous revision.</li> </ul> <h3><a class="p-link--anchor-heading" href="#p-31266-build-a-snap-in-20-minutes" name="p-31266-build-a-snap-in-20-minutes">Build a snap in 20 minutes</a></h3> <p>Ready to get started? By the end of this guide, you’ll understand how to make a snap of your Node.js app that can be published in the <a href="https://snapcraft.io/store" rel="noopener nofollow ugc">Snap Store</a>, showcasing it to millions of Linux users.</p> <blockquote> <p><img alt=":information_source:" class="emoji" height="20" loading="lazy" src="https://forum.snapcraft.io/images/emoji/twitter/information_source.png?v=12" title=":information_source:" width="20"/> For a brief overview of the snap creation process, including how to install <em>snapcraft</em> and how it’s used, see <a href="/docs/snapcraft-overview">Snapcraft overview</a>. For a more comprehensive breakdown of the steps involved, take a look at <a href="/docs/creating-a-snap">Creating a snap</a>.</p> </blockquote> <h2><a class="p-link--anchor-heading" href="#p-31266-getting-started" name="p-31266-getting-started">Getting started</a></h2> <p>Snaps are defined in a single YAML file placed in the root folder of your project. The following example shows the entire <em>snapcraft.yaml</em> file for an existing project, <a href="https://github.com/snapcraft-docs/wethr" rel="noopener nofollow ugc">Wethr</a>. Don’t worry, we’ll break this down.</p> <pre data-code-wrap="yaml"><code class="lang-yaml">name: wethr version: git summary: Command line weather tool. description: | Get current weather:- $ wethr Get current weather in metric units $ wethr --metric Get current weather in imperial units $ wethr --imperial confinement: strict base: core20 apps: wethr: command: bin/wethr parts: wethr: plugin: npm npm-node-version: 14.16.1 source: . </code></pre> <h4><a class="anchor" href="#p-31266-metadata-4" name="p-31266-metadata-4"></a>Metadata</h4> <p>The <code>snapcraft.yaml</code> file starts with a small amount of human-readable metadata, which usually can be lifted from the GitHub description or project README.md. This data is used in the presentation of your app in the Snap Store.</p> <pre data-code-wrap="yaml"><code class="lang-yaml">name: wethr version: git summary: Command line weather tool. description: | Get current weather:- $ wethr Get current weather in metric units $ wethr --metric Get current weather in imperial units $ wethr --imperial </code></pre> <p>The <code>name</code> must be unique in the Snap Store. Valid snap names consist of lower-case alphanumeric characters and hyphens. They cannot be all numbers. They also cannot start or end with a hyphen.</p> <p>By specifying <code>git</code> for the version, the current git tag or commit will be used as the version string. Versions carry no semantic meaning in snaps.</p> <p>The <code>summary</code> can not exceed 79 characters. You can use a chevron ‘&gt;’ in the <code>description</code> key to declare a multi-line description.</p> <h4><a class="anchor" href="#p-31266-base-5" name="p-31266-base-5"></a>Base</h4> <p>The base keyword declares which <em>base snap</em> to use with your project. A base snap is a special kind of snap that provides a run-time environment alongside a minimal set of libraries that are common to most applications:</p> <pre data-code-wrap="yaml"><code class="lang-yaml">base: core20 </code></pre> <p>As used above, <a href="https://snapcraft.io/core20" rel="noopener nofollow ugc"><code>core20</code></a> is the current standard base for snap building and is based on <a href="http://releases.ubuntu.com/20.04/" rel="noopener nofollow ugc">Ubuntu 20.04 LTS</a>.</p> <p>See <a href="/docs/base-snaps">Base snaps</a> for more details.</p> <h4><a class="anchor" href="#p-31266-security-model-6" name="p-31266-security-model-6"></a>Security model</h4> <p>The next section describes the level of confinement applied to your app.</p> <pre data-code-wrap="yaml"><code class="lang-yaml">confinement: strict </code></pre> <p>Snaps are containerised to ensure more predictable application behaviour and greater security. Unlike other container systems, the shape of this confinement can be changed through a set of interfaces. These are declarations that tell the system to give permission for a specific task, such as accessing a webcam or binding to a network port.</p> <p>It’s best to start a snap with the confinement in warning mode, rather than strictly applied. This is indicated through the <code>devmode</code> keyword. When a snap is in devmode, runtime confinement violations will be allowed but reported. These can be reviewed by running <code>journalctl -xe</code>.</p> <p>Because devmode is only intended for development, snaps must be set to strict confinement before they can be published as “stable” in the Snap Store. Once an app is working well in devmode, you can review confinement violations, add appropriate interfaces, and switch to strict confinement.</p> <h4><a class="anchor" href="#p-31266-parts-7" name="p-31266-parts-7"></a>Parts</h4> <p>Parts define what sources are needed to assemble your app. Parts can be anything: programs, libraries, or other needed assets. We’ll deal with libraries and other assets later, so for now we just have one part: the wethr source code.</p> <pre data-code-wrap="yaml"><code class="lang-yaml">parts: wethr: plugin: npm npm-node-version: 14.16.1 source: . </code></pre> <p>The <a href="/docs/npm-plugin">npm plugin</a> builds upon the work you’ve already done to describe your app’s dependencies in your package.json. It will automatically include these in your snap.</p> <p>The plugin also needs to know which version of Node to bundle. This is specified with the <code>npm-node-version</code> keyword.</p> <h4><a class="anchor" href="#p-31266-apps-8" name="p-31266-apps-8"></a>Apps</h4> <p>Apps are the commands you want to expose to users and any background services your application provides. Each key under <code>apps</code> is the command name that should be made available on users’ systems.</p> <p>The <code>command</code> specifies the full path to the binary to be run. This is resolved relative to the root of your snap contents.</p> <pre data-code-wrap="yaml"><code class="lang-yaml">apps: wethr: command: bin/wethr </code></pre> <p>If your command name matches the snap <code>name</code>, users will be able run the command directly. If the names differ, then apps are prefixed with the snap <code>name</code> (<code>wethr.command-name</code>, for example). This is to avoid conflicting with apps defined by other installed snaps.</p> <p>You can request an alias on the <a href="/docs/process-for-aliases-auto-connections-and-tracks">Snapcraft forum</a> if your command name and snap name do not match but you don’t want your command prefixed. These aliases are set up automatically when your snap is installed from the Snap Store.</p> <h3><a class="p-link--anchor-heading" href="#p-31266-building-the-snap" name="p-31266-building-the-snap">Building the snap</a></h3> <p>You can download the example repository with the following command:</p> <pre data-code-wrap="bash"><code class="lang-bash">$ git clone https://github.com/snapcraft-docs/wethr </code></pre> <p>After you’ve created the <em>snapcraft.yaml</em> (or use the one provided), you can build the snap by simply executing the <em>snapcraft</em> command in the project directory:</p> <pre data-code-wrap="bash"><code class="lang-bash">$ snapcraft Launching a container. Waiting for container to be ready Waiting for network to be ready... snapd is not logged in, snap install commands will use sudo snap "core20" has no updates available Updating pull step for wethr (source changed) + snapcraftctl pull Updating build step for wethr ('pull' step changed) + snapcraftctl build + '[' '!' -f /root/parts/wethr/install/bin/node ']' + curl -s https://nodejs.org/dist/v14.16.1/node-v14.16.1-linux-x64.tar.gz + tar xzf - -C /root/parts/wethr/install/ --strip-components=1 ++ npm pack . ++ tail -1 npm notice npm notice 📦 wethr@1.5.2 npm notice === Tarball Contents === npm notice 1.1kB LICENSE npm notice 29.1kB demo.gif npm notice 853B get-emoji.js npm notice 1.7kB test/get-emoji.js npm notice 1.6kB wethr.js npm notice 602B package.json npm notice 298B README.md npm notice 30.7kB wethr-1.5.2.tgz npm notice 385B snapcraft.yaml npm notice === Tarball Details === npm notice name: wethr npm notice version: 1.5.2 npm notice filename: wethr-1.5.2.tgz npm notice package size: 61.6 kB npm notice unpacked size: 66.3 kB npm notice shasum: eb4c7ddc744ed0c6d2260f53fc14886683e6a239 npm notice integrity: sha512-cMLaJp36D45YW[...]gagZhUY0uLgSA== npm notice total files: 9 npm notice + npm install -g --prefix /root/parts/wethr/install wethr-1.5.2.tgz /root/parts/wethr/install/bin/wethr -&gt; /root/parts/wethr/install/lib/node_modules/wethr/wethr.js + wethr@1.5.2 added 47 packages from 34 contributors in 2.555s Cleaning later steps and re-staging wethr ('build' step changed) + snapcraftctl stage Priming wethr + snapcraftctl prime 'grade' property not specified: defaulting to 'stable'. Determining the version from the project repo (version: git). The version has been set to 'v1.4.0+git11.0cf85b4' Snapping | Snapped wethr_v1.4.0+git11.0cf85b4_amd64.snap </code></pre> <p>The resulting snap can be installed locally. This requires the <code>--dangerous</code> flag because the snap is not signed by the Snap Store. The <code>--devmode</code> flag acknowledges that you are installing an unconfined application:</p> <pre data-code-wrap="bash"><code class="lang-bash">$ sudo snap install wethr_*.snap --devmode --dangerous </code></pre> <p>You can then try it out:</p> <pre data-code-wrap="bash"><code class="lang-bash">$ wethr London, GB: 17.04C 🌧 </code></pre> <p>Removing the snap is simple too:</p> <pre data-code-wrap="bash"><code class="lang-bash">$ sudo snap remove wethr </code></pre> <p>You can also clean up the build environment, although this will slow down the next initial build:</p> <pre data-code-wrap="bash"><code class="lang-bash">$ snapcraft clean </code></pre> <p>By default, when you make a change to snapcraft.yaml, snapcraft only builds the parts that have changed. Cleaning a build, however, forces your snap to be rebuilt in a clean environment and will take longer.</p> <h2><a class="p-link--anchor-heading" href="#p-31266-publishing-your-snap" name="p-31266-publishing-your-snap">Publishing your snap</a></h2> <p>To share your snaps you need to publish them in the Snap Store. First, create an account on <a href="https://dashboard.snapcraft.io/dev/account/" rel="noopener nofollow ugc">the dashboard</a>. Here you can customise how your snaps are presented, review your uploads and control publishing.</p> <p>You’ll need to choose a unique “developer namespace” as part of the account creation process. This name will be visible by users and associated with your published snaps.</p> <p>Make sure the <code>snapcraft</code> command is authenticated using the email address attached to your Snap Store account:</p> <pre data-code-wrap="bash"><code class="lang-bash">$ snapcraft login </code></pre> <h3><a class="p-link--anchor-heading" href="#p-31266-reserve-a-name-for-your-snap" name="p-31266-reserve-a-name-for-your-snap">Reserve a name for your snap</a></h3> <p>You can publish your own version of a snap, provided you do so under a name you have rights to. You can register a name on <a href="https://dashboard.snapcraft.io/register-snap/" rel="noopener nofollow ugc">dashboard.snapcraft.io</a>, or by running the following command:</p> <pre data-code-wrap="bash"><code class="lang-bash">$ snapcraft register mynodesnap </code></pre> <p>Be sure to update the <code>name:</code> in your <code>snapcraft.yaml</code> to match this registered name, then run <code>snapcraft</code> again.</p> <h3><a class="p-link--anchor-heading" href="#p-31266-upload-your-snap" name="p-31266-upload-your-snap">Upload your snap</a></h3> <p>Use snapcraft to push the snap to the Snap Store.</p> <pre data-code-wrap="bash"><code class="lang-bash">$ snapcraft upload --release=edge mynodesnap_*.snap </code></pre> <p>If you’re happy with the result, you can commit the snapcraft.yaml to your GitHub repo and <a href="https://build.snapcraft.io" rel="noopener nofollow ugc">turn on automatic builds</a> so any further commits automatically get released to edge, without requiring you to manually build locally.</p> <p>Congratulations! You’ve just built and published your first Node snap. For a more in-depth overview of the snap building process, see <a href="/docs/creating-a-snap">Creating a snap</a>.</p> <hr /> <p><i>Last updated 1 year, 10 months ago.</i></p> <div class="p-notification--information"> <div class="p-notification__content"> <p class="p-notification__message"> <a href="https://forum.snapcraft.io/t/node-apps/6747">Help improve this document in the forum</a>. </p> </div> </div> </div> </div> </main> </div> <div class="l-docs__footer"> <footer class="p-strip--dark l-docs__subgrid"> <div class="l-docs__sidebar"> <p> <a class="p-link--inverted" href="#" style="padding-left: 1.5rem">Back to top <i class="p-icon--chevron-up is-light"></i></a> </p> <p style="padding-left: 1.5rem"> &copy; 2025 Canonical Ltd. </p> </div> <div class="l-docs__main"> <nav class="row" aria-label="Footer"> <div class="has-cookie"> <p>Ubuntu and Canonical are registered trademarks of Canonical Ltd. <br /> Powered by <a href="https://www.ubuntu.com/kubernetes">Charmed Kubernetes</a> </p> <p class="u-no-limit"> <small> <a href="https://forum.snapcraft.io/">Join the forum</a>, contribute to or report problems with, <a href="https://bugs.launchpad.net/snapd">snapd</a>, <a href="https://bugs.launchpad.net/snapcraft">Snapcraft</a>, or <a href="https://github.com/canonical/snapcraft.io/issues/new">this site</a>. </small> </p> <ul class="p-inline-list--middot u-no-margin--bottom"> <li class="p-inline-list__item"> <a class="p-link--inverted" href="https://ubuntu.com/legal/terms-and-policies/snap-store-terms"><small>Terms of Service</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted" href="https://www.ubuntu.com/legal/data-privacy"><small>Data privacy</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted js-revoke-cookie-manager" href=""><small>Manage your tracker settings</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted" href="https://status.snapcraft.io/"><small>Service status</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted" href="https://dashboard.snapcraft.io/"><small>Other functions</small></a> </li> </ul> </div> </nav> </div> <div> <ul class="p-inline-list u-align--right" style="padding-right: 1.5rem"> <li class="p-inline-list__item"> <a href="https://twitter.com/snapcraftio" class="p-icon--twitter">Share on Twitter</a> </li> <li class="p-inline-list__item"> <a href="https://www.facebook.com/snapcraftio" class="p-icon--facebook">Share on Facebook</a> </li> <li class="p-inline-list__item"> <a href="https://www.youtube.com/snapcraftio" class="p-icon--youtube">Share on YouTube</a> </li> </ul> </div> </footer> </div> <script> window.addEventListener("DOMContentLoaded", function() { Raven.context(function() { // Based on Vanilla side navigation example // Should be moved out from the template as part of a given project JS bundle (function () { /** Toggles the expanded/collapsed classed on side navigation element. @param {HTMLElement} sideNavigation The side navigation element. @param {Boolean} show Whether to show or hide the drawer. */ function toggleDrawer(sideNavigation, show) { const toggleButtonOutsideDrawer = sideNavigation.querySelector( ".p-side-navigation__toggle" ); const toggleButtonInsideDrawer = sideNavigation.querySelector( ".p-side-navigation__toggle--in-drawer" ); if (sideNavigation) { if (show) { sideNavigation.classList.remove("is-drawer-collapsed"); sideNavigation.classList.add("is-drawer-expanded"); toggleButtonInsideDrawer.focus(); toggleButtonOutsideDrawer.setAttribute("aria-expanded", true); toggleButtonInsideDrawer.setAttribute("aria-expanded", true); } else { sideNavigation.classList.remove("is-drawer-expanded"); sideNavigation.classList.add("is-drawer-collapsed"); toggleButtonOutsideDrawer.focus(); toggleButtonOutsideDrawer.setAttribute("aria-expanded", false); toggleButtonInsideDrawer.setAttribute("aria-expanded", false); } } } // throttle util (for window resize event) var throttle = function (fn, delay) { var timer = null; return function () { var context = this, args = arguments; clearTimeout(timer); timer = setTimeout(function () { fn.apply(context, args); }, delay); }; }; /** Attaches event listeners for the side navigation toggles @param {HTMLElement} sideNavigation The side navigation element. */ function setupSideNavigation(sideNavigation) { var toggles = [].slice.call( sideNavigation.querySelectorAll(".js-drawer-toggle") ); var drawerEl = sideNavigation.querySelector(".p-side-navigation__drawer"); // hide navigation drawer on small screens sideNavigation.classList.add("is-drawer-hidden"); // setup drawer element drawerEl.addEventListener("animationend", () => { if (!sideNavigation.classList.contains("is-drawer-expanded")) { sideNavigation.classList.add("is-drawer-hidden"); } }); window.addEventListener("keydown", (e) => { if (e.key === "Escape") { toggleDrawer(sideNavigation, false); } }); // setup toggle buttons toggles.forEach(function (toggle) { toggle.addEventListener("click", function (event) { event.preventDefault(); if (sideNavigation) { sideNavigation.classList.remove("is-drawer-hidden"); toggleDrawer( sideNavigation, !sideNavigation.classList.contains("is-drawer-expanded") ); } }); }); // hide side navigation drawer when screen is resized window.addEventListener( "resize", throttle(function () { toggles.forEach((toggle) => { return toggle.setAttribute("aria-expanded", false); }); // remove expanded/collapsed class names to avoid unexpected animations sideNavigation.classList.remove("is-drawer-expanded"); sideNavigation.classList.remove("is-drawer-collapsed"); sideNavigation.classList.add("is-drawer-hidden"); }, 10) ); } /** Attaches event listeners for all the side navigations in the document. @param {String} sideNavigationSelector The CSS selector matching side navigation elements. */ function setupSideNavigations(sideNavigationSelector) { // Setup all side navigations on the page. var sideNavigations = [].slice.call( document.querySelectorAll(sideNavigationSelector) ); sideNavigations.forEach(setupSideNavigation); } setupSideNavigations('.p-side-navigation, [class*="p-side-navigation--"]'); // Setup expandable side navigation var expandToggles = document.querySelectorAll(".p-side-navigation__expand"); var navigationLinks = document.querySelectorAll(".p-side-navigation__link"); // setup default values of aria-expanded for the toggle button, list title and list itself const setup = (toggle) => { const isExpanded = toggle.getAttribute("aria-expanded") === "true"; if (!isExpanded) { toggle.setAttribute("aria-expanded", isExpanded); } const item = toggle.closest(".p-side-navigation__item"); const link = item.querySelector(".p-side-navigation__link"); const nestedList = item.querySelector(".p-side-navigation__list"); if (!link?.hasAttribute("aria-expanded")) { link.setAttribute("aria-expanded", isExpanded); } if (!nestedList?.hasAttribute("aria-expanded")) { nestedList.setAttribute("aria-expanded", isExpanded); } }; const handleToggle = (e) => { const item = e.currentTarget.closest(".p-side-navigation__item"); const button = item.querySelector(".p-side-navigation__expand"); const link = item.querySelector(".p-side-navigation__link"); const nestedList = item.querySelector(".p-side-navigation__list"); [button, link, nestedList].forEach((el) => el.setAttribute( "aria-expanded", el.getAttribute("aria-expanded") === "true" ? "false" : "true" ) ); }; expandToggles.forEach((toggle) => { setup(toggle); toggle.addEventListener("click", (e) => { handleToggle(e); }); }); })(); }); }); </script> <script src="/static/js/dist/global-nav.js?v=091031d"></script> <script type="application/ld+json"> { "@context": "http://schema.org/", "@id": "https://snapcraft.io/#organization", "@type": "Organization", "name": "Snapcraft", "logo": "https://assets.ubuntu.com/v1/e635d1ef-snapcraft_green-red_hex.png", "url": "https://snapcraft.io", "sameAs": [ "https://developer.ubuntu.com/snapcraft", "https://github.com/snapcore/snapcraft", "https://en.wikipedia.org/wiki/Snappy_(package_manager)", "https://twitter.com/snapcraftio", "https://www.facebook.com/snapcraftio/", "https://www.youtube.com/snapcraftio" ] } </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@id": "https://snapcraft.io/#website", "@type": "WebPage", "name": "Snapcraft", "url": "https://snapcraft.io/docs/node-apps" } </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10