1. Empezando
Este tutorial ha sido escrito para funcionar en Ubuntu 18.04 LTS. Sin embargo, debería funcionar sin modificaciones en versiones posteriores de Ubuntu y otras distribuciones de GNU / Linux derivadas de una base de Ubuntu 18.04, como Linux Mint 19.x.
Instalación de dependencias
Primero, abra una terminal y asegúrese de haber instalado snap :
$ snap --version
Si está instalado, verá algo similar a lo siguiente:
snap 2.39.3
snapd 2.39.3
series 16
ubuntu 18.04
kernel 5.0.0-36-generic
Consulte Instalación de snapd si snap no está instalado.
Ahora podemos instalar Snapcraft con un solo comando:
$ sudo snap install --classic snapcraft
NOTA: El --classic
interruptor permite la instalación de un broche que utiliza el confinamiento clásico . Hablamos del confinamiento de seguridad instantánea en la siguiente sección.
Estamos listos. ¡Empecemos y construyamos nuestro primer snap!
2. Crear un complemento es fácil
Iniciando el proyecto
Lo primero que debe hacer es crear un directorio de instantáneas general seguido de un directorio de trabajo para este proyecto de instantánea específico:
$ mkdir -p ~/mysnaps/hello
$ cd ~/mysnaps/hello
Es desde dentro de este hello
directorio donde invocaremos todos los comandos posteriores.
NOTA: Debido a una limitación en el proyecto que vamos a construir, la ruta del directorio en el que colocó el hello
directorio no debe contener espacios .
Empiece por inicializar su entorno instantáneo:
$ snapcraft init
Esto crea un snapcraft.yaml
en el que declaras cómo se construye el complemento y qué propiedades expone al usuario. Editaremos esto más tarde.
La estructura del directorio ahora se ve así:
mysnaps/
??? hello
??? snap
??? snapcraft.yaml
Nota: Cualquier instantánea futura que desee crear debe colocarse dentro de su propio directorio en mysnaps
.
Describiendo el chasquido
Echemos un vistazo a la parte superior de su archivo snapcraft.yaml. Debería verse como se muestra a continuación:
name: my-snap-name # you probably want to 'snapcraft register <name>'
base: core18 # the base snap is the execution environment for this snap
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: Single-line elevator pitch for your amazing snap # 79 char long summary
description: |
This is my-snap's description. You have a paragraph or two to tell the
most important story about your snap. Keep it under 100 words though,
we live in tweetspace and your description wants to look good in the snap
store.
grade: devel # must be 'stable' to release into candidate/stable channels
confinement: devmode # use 'strict' once you have the right plugs and slots
Esta parte de snapcraft.yaml
es obligatoria y son metadatos básicos para el complemento.
Repasemos esta línea por línea:
-
nombre : el nombre del complemento.
-
base : un complemento básico que proporciona un entorno de tiempo de ejecución con un conjunto mínimo de bibliotecas que son comunes a la mayoría de las aplicaciones. Para la mayoría de las instantáneas, esto debería ser
core18
, lo que equivale a Ubuntu 18.04 LTS. -
versión : la versión actual del complemento. Esta es solo una cadena legible por humanos. Todas las cargas instantáneas recibirán una revisión instantánea incremental , que es independiente de esta versión. Está separado para que pueda cargar varias veces el mismo complemento para la misma arquitectura con la misma versión. Véalo como una cadena que le indica a su usuario la versión actual, como "estable", "2.0", etc.
-
resumen : un resumen breve de una línea o un eslogan para su complemento.
descripción : una descripción más larga del complemento. Puede abarcar varias líneas si tiene el prefijo '|' personaje.
-
grado : puede ser utilizado por el editor para indicar la confianza de calidad en la construcción. La tienda evitará publicar compilaciones de grado 'desarrollo' en el canal 'estable'.
-
confinamiento : nivel de confinamiento de un broche de presión es el grado de aislamiento que tiene de su sistema, y hay tres niveles:
strict
,classic
ydevmode
. Las instantáneas estrictas se ejecutan en completo aislamiento, lasclassic
instantáneas tienen acceso abierto a los recursos del sistema y las instantáneas en modo de desarrollo se ejecutan de forma estricta pero con acceso abierto al sistema. Este último es ideal para el desarrollo, pero su complemento deberá pasar del modo dev para ser publicado. Consulte Confinamiento instantáneo para obtener más detalles.En este tutorial, vamos a centrarnos en
devmode
ystrict
confinamiento.
Para obtener información más detallada sobre estos metadatos de nivel superior, consulte Agregar metadatos globales .
Y eso es todo por lo básico. Ahora es el momento de personalizar el archivo snapcraft.yaml para nuestro propio complemento. Teniendo en cuenta lo anterior, podemos cambiar la parte superior del archivo para que sea:
name: hello
base: core18
version: '2.10'
summary: GNU Hello, the "hello world" snap
description: |
GNU hello prints a friendly greeting.
grade: devel
confinement: devmode
Nota:
La información de la versión es solo para el consumo instantáneo del
usuario y no tiene ningún efecto sobre las actualizaciones instantáneas.
Se define entre comillas, ( '2.10'
), porque debe ser una cadena YAML en lugar de un número de punto flotante. El uso de una cadena permite detalles de versión no numéricos, como ' myfirstversion
' o ' 2.3-git
'.
Agregar una pieza
Las partes se utilizan para describir su aplicación, dónde se pueden encontrar sus diversos componentes, sus requisitos de compilación y tiempo de ejecución, y los de sus dependencias. Un complemento consta de una o más partes, según su complejidad.
Aquí hay algunos ejemplos de instantáneas de varias partes: - instantáneas con partes lógicas separadas, como una instantánea de servidor que contiene un servidor web, una base de datos y la aplicación misma - un juego que envía el motor del juego y los datos del juego para tres juegos diferentes, cada uno uno está definido en su propia parte - encaja con partes de diferentes ubicaciones - partes que se construyen de una manera diferente
Nuestro hello
complemento será agradable y simple. Consistirá en una sola parte por ahora. En las siguientes páginas la vamos a ampliar gradualmente.
Dos elementos imprescindibles para cada parte son la definición de "fuente" y "complemento". Piense en estos como el "qué" y el "cómo", respectivamente. Como fuente, puede, por ejemplo, elegir un repositorio de fuentes (como git
), un tarball o un directorio local. Snapcraft
admite muchos complementos, lo que le permite crear una amplia variedad
de tipos de proyectos (por ejemplo, autotools, cmake, go, maven,
nodejs, python2, python3).
Para compilar hello
, agregue la siguiente estrofa de 'partes' a su snapcraft.yaml
archivo (reemplace cualquier otra cosa que pueda estar allí):
parts:
gnu-hello:
source: http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
plugin: autotools
Entonces hemos agregado una parte llamada gnu-hello
(su nombre es arbitrario). Para 'fuente', especificamos un tarball ubicado en el servidor FTP del proyecto GNU. Como 'complemento', hemos elegido autotools
cuál utiliza los ./configure && make && make install
pasos de compilación tradicionales .
Ver plugins compatibles , o correr snapcraft list-plugins
, para obtener más información sobre la que construir-herramientas y plataformas soportes Snapcraft.
Para construir nuestro complemento, todo lo que necesita hacer es:
$ snapcraft
La primera vez que ejecute snapcraft, es posible que se le solicite permiso para instalar Multipass . Snapcraft usa Multipass tanto para simplificar el proceso de construcción como para confinar el entorno de construcción dentro de una máquina virtual. Ofrece la mejor experiencia de construcción, por lo que recomendamos encarecidamente responder "y". Sin embargo, si prefiere no utilizar Multipass, también puede compilar de forma nativa, remota y con LXD. Consulte Opciones de compilación para obtener más detalles.
Durante la compilación, Snapcraft mostrará una gran cantidad de resultados, sin embargo, una compilación exitosa terminará con:
[...]
Staging gnu-hello
Priming gnu-hello
Snapping 'hello' |
Snapped hello_2.10_amd64.snap
¡Felicidades! Acaba de crear su primer complemento, que ahora está listo para ser instalado:
$ sudo snap install --devmode hello_2.10_amd64.snap
La salida debe declarar:
hello 2.10 installed
Para obtener información sobre el complemento instalado:
$ snap list hello
Salida de muestra:
Name Version Rev Tracking Developer Notes
hello 2.10 x1 - - devmode
Intentemos ejecutarlo:
$ hello
En Ubuntu tradicional obtendrás:
The program 'hello' can be found in the following packages:
* hello
* hello-traditional
Try: sudo apt install <selected package>
O puede obtener un error diferente si instaló previamente el hello
complemento:
$ hello
Salida:
bash: /snap/bin/hello No such file
¡El comando no existe a pesar de ser parte de nuestro complemento e instalado! De hecho, las instantáneas no exponen nada al usuario de forma predeterminada (comando, servicios, etc.). Tenemos que hacer esto explícitamente y eso es exactamente lo que vas a abordar a continuación.
Si se hace el trabajo para usted, usted debe verificar que es el correcto hello
orden. Verifique la salida de which hello
- podría enumerar algo como /usr/bin/hello
. Lo que buscamos es un binario en el /snap/bin
directorio.
3. ¡Exponer una aplicación a través de su complemento!
Definición de comandos
Para que los servicios y comandos estén expuestos a los usuarios, ¡debe especificarlos, por snapcraft.yaml
supuesto! Esto se encargará de un par de cosas por ti:
- se asegurará de que los servicios se inicien / detengan automáticamente
- todos los comandos tendrán "espacio de nombres", por lo que podría, por ejemplo, instalar el mismo complemento de diferentes editores y aún poder ejecutar los instantáneos por separado
Exponer el hello
comando es indoloro. Todo lo que necesita hacer es agregar lo siguiente a su snapcraft.yaml
archivo:
apps:
hello:
command: bin/hello
Esto define una aplicación denominada hello
, que apunta al ejecutable bin/hello
en la estructura de directorio enviada por el complemento.
Por lo general, recomendamos colocar esta estrofa entre los campos de metadatos y el campo 'partes'. Técnicamente, el orden no importa, pero tiene sentido colocar las piezas básicas antes que las más complejas.
Nuestro snapcraft.yaml
archivo ahora debería parecerse a esto:
name: hello
base: core18
version: '2.10'
summary: GNU Hello, the "hello world" snap
description: |
GNU hello prints a friendly greeting.
grade: devel
confinement: devmode
apps:
hello:
command: bin/hello
parts:
gnu-hello:
source: http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
plugin: autotools
Iterando sobre tu chasquido
Ahora que el comando está definido, reconstruyamos el complemento. Puede hacer esto simplemente ejecutando Snapcraft nuevamente; solo los elementos nuevos o modificados se construirán y fusionarán en un nuevo complemento.
Sin embargo, para mostrar un proceso de creación de instantáneas más típico, usaremos un comando ligeramente diferente que nos permitirá echar un vistazo al complemento que estamos construyendo antes de que se cree el complemento:
$ snapcraft prime --shell
Este comando le dice a snapcraft que ejecute la compilación hasta el paso "principal" y abra un shell dentro del entorno de compilación instantánea, siendo el primer paso la etapa final en un proceso de cuatro pasos:
- pull: descarga o recupera los componentes necesarios para construir la pieza
- construir: construye la pieza a partir de los componentes extraídos previamente
- copia los componentes integrados en el área de preparación
- copia los componentes en etapas en el área de imprimación, en sus ubicaciones finales para el ajuste resultante.
Otro comando útil es snapcraft --debug
. Esto
abrirá un shell en el entorno de compilación cuando se produzca un
error, lo que le permitirá investigar el error antes de reanudar la
compilación.
Desde dentro del shell, puede ver que si bien el binario que acabamos de agregar está en el directorio de escenario , aún no está en primo :
$ ls stage/bin/
hello
$ ls prime/bin/
ls: cannot access 'prime/bin': No such file or directory
Puede continuar construyendo su snap desde dentro del entorno de construcción usando los mismos comandos de snapcraft que usa en el exterior, con la conveniencia de tener un prompt directamente dentro del entorno. Para construir el escenario principal, por ejemplo, simplemente escriba snapcraft prime
:
$ snapcraft prime
Skipping pull gnu-hello (already ran)
Skipping build gnu-hello (already ran)
Skipping stage gnu-hello (already ran)
Priming gnu-hello
El binario hello ahora estará en el directorio prime / bin :
$ sudo snap install --devmode hello_2.10_amd64.snap
$ ls prime/bin
hello
Para reanudar la compilación y generar el complemento, puede escribir snapcraft
dentro del entorno de compilación o salir y ejecutar snapcraft
nuevamente desde allí. De cualquier manera, el complemento resultante se colocará en el directorio del proyecto del complemento.
Ahora podemos volver a instalar el nuevo complemento y ejecutar hello :
$ hello
Hello, world!
La ruta para el binario también debe establecerse correctamente:
$ which hello
/snap/bin/hello
¡Bien hecho! ¡Acabas de hacer tu primer snap de trabajo!
4. Un broche está hecho de piezas
Agreguemos otra parte para hacer el complemento un poco más interesante. En la definición de 'partes', agregue:
parts:
[...]
gnu-bash:
source: http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
plugin: autotools
Notarás que esta parte (nombrada gnu-bash
) funciona de manera muy similar a la gnu-hello
parte anterior: descarga un tarball y lo construye usando el autotools
complemento.
Como hicimos antes, necesitamos definir el comando que queremos exponer. Hagamos esto ahora. En la definición de 'aplicaciones', agregue:
apps:
[...]
bash:
command: bash
Esta vez, el nombre del comando es diferente del nombre del complemento. De forma predeterminada, todos los comandos se exponen al usuario como <snap-name>.<command-name>
. Este binario será así hello.bash
. De esa manera, evitaremos un conflicto con /bin/bash
(los binarios del sistema triunfan sobre los binarios enviados por snaps) o cualquier otro snaps que envíe un bash
comando. Sin embargo, como recordará, se nombra el primer binario hello
. Esto se debe a la simplificación cuando es igual. En lugar de hello.hello
, tenemos el comando condensado en hello
.
Nuestro complemento, por lo tanto, dará como resultado el envío de dos binarios: hello
y hello.bash
.
Tenga en cuenta que lo configuramos bash
como el parámetro de comando, y no bin/bash
relativo al directorio snap del sistema ( $SNAP=/snap/hello/current
) como lo hicimos hello
. Ambos son igualmente válida porque snapcraft
y snapd
crear un pequeño envoltorio alrededor de su comando ejecutable que establece algunas variables de entorno. Técnicamente, $SNAP/bin
se le antepondrá a usted $PATH
para este complemento. Esto evita la necesidad de establecer la ruta de forma explícita. Este tema se abordará en las próximas secciones.
Ahora vuelva a hacer la compilación:
$ snapcraft
gnu-bash
Ahora solo se construirá la parte (ya que nada cambió en la otra parte). Esto
hace que las cosas sean más rápidas, pero dado que Bash es en sí mismo
una pieza importante de software, este comando aún tardará bastante en
completarse.
Instale el complemento resultante nuevamente y verifique si el nuevo binario está disponible:
$ sudo snap install --devmode hello_2.10_amd64.snap
$ hello
Hello, world!
Ahora prueba bash:
$ hello.bash
Lo anterior debería producir:
bash-4.3$ env
[ outputs a list of environment variables ]
Ahora sal de ese shell de Bash:
bash-4.3$ exit
Verá que las variables de entorno disponibles en su complemento son un poco diferentes de su entorno de usuario. Se agregan $SNAP_
algunas variables adicionales como y algunas variables de entorno del sistema se han modificado para que apunten a su directorio snap, como $PATH
o $LD_LIBRARY_PATH
. ¡Tómate el tiempo para familiarizarte con ellos!
Consulte Variables de entorno para obtener más detalles.
¡Excelente trabajo! ¡Lo tienes todo bien y funcionando!
5. Eliminando devmode
Una última cosa que podría querer hacer antes de que el complemento esté listo para un consumo más amplio es eliminar el devmode
estado.
Importante: los
usuarios de snaps que usen devmode
deberán pasar --devmode
durante la instalación, por lo que aceptan explícitamente confiar en usted y en su complemento. Otro beneficio de eliminar devmode
es
que podrá enviar su complemento a los canales 'estables' o 'candidatos'
(solo puede liberar a los otros canales, como 'beta' o 'borde' ya que
su complemento es menos confiable) y los usuarios podrán buscarlo usando
snap find
.
Para que esto sea declarado en su complemento, vamos a establecer confinement
a strict
en snapcraft.yaml
:
confinement: strict
¡Ahora construyamos el complemento e instálelo correctamente! Es decir, vamos a llamar snapcraft
sin --devmode
probarlo realmente en confinamiento:
$ snapcraft
[...]
$ sudo snap install hello_2.10_amd64.snap
Nota:
Obtuvimos el nombre del paquete instantáneo de la última línea de salida del snapcraft
comando.
¡Ay! Esto da:
error: cannot find signatures with metadata for snap "hello_2.10_amd64.snap"
De hecho, intentamos instalar un complemento que no estaba firmado por Snap Store. Anteriormente, realizamos instalaciones locales a través de las --devmode
cuales implicaba (además de ejecutarse sin confinamiento) que se podía instalar un complemento sin firmar. Como este ya no es el caso, debemos indicar que está bien instalar un complemento sin firmar. Esto se hace a través de la --dangerous
opción:
$ sudo snap install hello_2.10_amd64.snap --dangerous
¡Prueba de nuevo!
$ hello
Hello, world!
Creando un nuevo caparazón
$ hello.bash
... y emita un comando allí:
bash-4.3$ ls
ahora da:
ls: cannot open directory '.': Permission denied
Salga del caparazón por ahora:
bash-4.3$ exit
¿Que esta pasando aqui? Su complemento no está roto, solo está confinado ahora y, por lo tanto, solo puede acceder a sus propios directorios respectivos.
Nota:
Para otras instantáneas, es posible que deba declarar si los comandos o
servicios necesitan permisos especiales (por ejemplo, acceso a la red o
al audio). Un tutorial sobre "interfaces", "ranuras" y "enchufes" cubrirá este mismo tema.
Estás listo. Este complemento está listo para su publicación. ¡Increíble!
6. Empuje a la tienda
Las aplicaciones se cargan fácilmente en Snap Store . Registrar una cuenta es fácil, así que hagámoslo primero.
Registro de una cuenta
Comience por ir al panel de Snapcraft y haga clic en el botón "Iniciar sesión o registrarse" en la esquina superior derecha:
Si aún no tiene una cuenta de Ubuntu One (SSO), seleccione "Soy un nuevo usuario de Ubuntu One" y complete los datos necesarios:
Una vez que haya iniciado sesión en Ubuntu One, verá su nombre en la esquina superior derecha. Haga clic en su nombre para revelar un menú y luego seleccione "Detalles de la cuenta". Deberá aceptar los Términos y condiciones para desarrolladores antes de hacer clic en el botón verde "Registrarse":
Se mostrará su configuración actual. Revíselos. Su "nombre de usuario de la tienda Snap" puede estar preestablecido y no se puede editar. Hay "datos de contacto" que tal vez desee completar, así como una foto personal para cargar.
Si realizó algún cambio, presione el botón verde "Actualizar mi cuenta".
Autenticación de línea de comandos
Ahora iniciaremos sesión con el comando snapcraft usando su nueva cuenta. La primera vez que lo haga, se le pedirá que habilite la autenticación multifactor y que acepte los términos y condiciones del desarrollador:
$ snapcraft login
A continuación, se muestra una sesión de muestra:
Enter your Ubuntu One e-mail address and password.
If you do not have an Ubuntu One account, you can create one at https://snapcraft.io/account
Email: myemail@provider.com
Password:
Second-factor auth: (press Enter if you don't use two-factor authentication):
Login successful.
Puede cerrar sesión en cualquier momento con snapcraft logout
.
Registrar un nombre instantáneo
Antes de poder cargar un complemento, deberá registrar (reservar) un nombre para él. Esto se hace con snapcraft register <some_name>
.
Aquí, asumiendo que Javier es el nombre de usuario de la tienda establecido anteriormente, haremos:
$ snapcraft register hello-javier
A continuación, se muestra una sesión de muestra:
We always want to ensure that users get the software they expect
for a particular name.
If needed, we will rename snaps to ensure that a particular name
reflects the software most widely expected by our community.
For example, most people would expect 'thunderbird' to be published by
Mozilla. They would also expect to be able to get other snaps of
Thunderbird as 'thunderbird-$username'.
Would you say that MOST users will expect 'hello-javier' to come from
You, and be the software you intend to publish there? [y/N]: y
Registering hello-javier.
Congratulations! You're now the publisher for 'hello-javier'.
Claramente, la Tienda prefiere que el nombre sea del formato <local snap name>-<store-username>
.
El nombre del complemento hello-javier
es diferente del hello
que colocamos inicialmente en nuestro snapcraft.yaml
archivo. Necesitaremos editar ese archivo en consecuencia y reconstruir el complemento. ¡Este es también un momento oportuno para cambiar el 'grado' a 'estable'!
El archivo ahora debería incluir las siguientes líneas:
name: hello-javier
grade: stable
Reconstruir:
$ snapcraft
Ahora debería tener un paquete instantáneo llamado hello_-javier_2.10_amd64.snap
.
Nota:
recuerde que ya instaló un paquete instantáneo llamado hello_2.10_amd64.snap
. No olvide desinstalarlo con sudo snap remove hello
.
Empuje y suelte su broche
¡Es hora de que este complemento esté disponible para el mundo!
Lancémoslo al canal 'candidato' por ahora:
$ snapcraft push hello-javier_2.10_amd64.snap --release=candidate
Salida:
Pushing hello-javier_2.10_amd64.snap
After pushing, an attempt will be made to release to 'candidate'
Preparing to push
'/home/ubuntu/mysnaps/hello/hello-javier_2.10_amd64.snap' to the store.
Pushing hello-javier_2.10_amd64.snap [====================================================] 100%
Processing...|
Ready to release!
Revision 1 of 'hello-javier' created.
Track Arch Channel Version Revision
latest amd64 stable - -
candidate 2.10 1
beta ^ ^
edge ^ ^
The 'candidate' channel is now open.
Debería recibir un correo electrónico informándole que su complemento está pendiente de revisión (verificación automática). Si no está utilizando ninguna interfaz reservada y los controles de seguridad están pasando, los usuarios podrán instalarlo así:
$ sudo snap install hello-javier --channel=candidate
Mientras cargamos un binario amd64, solo las personas en máquinas de 64 bits tendrán acceso a este complemento. Puede concentrarse en una arquitectura para admitir, construir manualmente un binario para cada arquitectura que desee admiti