Appimage/ja: Difference between revisions

From NixOS Wiki
Created page with "Appimage"
 
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
Line 5: Line 5:


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
On most distros, all one has to do is download the <code>.AppImage</code> file, make it executable <code>chmod +x $AppImage</code>, and execute it. This doesn't work in NixOS out of the box though, as AppImage files usually (if not always) depend on certain libraries commonly found on other Linux distributions to exist on certain paths; such as <code>/lib64/ld-linux-x86-64.so.2</code>.
== Usage ==
</div>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
== Running an AppImage file on NixOS ==
=== Run ===
</div>
 
<div lang="en" dir="ltr" class="mw-content-ltr">
On most distros, all one has to do is download the <code>.AppImage</code> file, make it executable <code>chmod +x $AppImage</code>, and execute it. This doesn't work in NixOS out of the box though, as AppImage files usually (if not always) depend on certain system libraries in hardcoded paths.
</div>
</div>


Line 16: Line 20:
$ appimage-run $AppImageFile
$ appimage-run $AppImageFile
</syntaxhighlight>
</syntaxhighlight>
<div lang="en" dir="ltr" class="mw-content-ltr">
=== Packaging ===
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
== Register AppImage files as a binary type to binfmt_misc ==
See the [https://nixos.org/manual/nixpkgs/stable/#sec-pkgs-appimageTools nixpkgs manual on wrapping AppImage packages]. In short, the AppImage is extracted and any dependencies are added as nix build dependencies.
Following example is a derivation for the program Quba, which is also distributed as AppImage.<syntaxhighlight lang="nix">
{
  lib,
  appimageTools,
  fetchurl,
}:
</div>
 
<div lang="en" dir="ltr" class="mw-content-ltr">
let
  version = "1.4.0";
  pname = "quba";
  name = "${pname}-${version}";
</div>
 
  <div lang="en" dir="ltr" class="mw-content-ltr">
src = fetchurl {
    url = "https://github.com/ZUGFeRD/quba-viewer/releases/download/v${version}/Quba-${version}.AppImage";
    hash = "sha256-EsTF7W1np5qbQQh3pdqsFe32olvGK3AowGWjqHPEfoM=";
  };
</div>
 
  <div lang="en" dir="ltr" class="mw-content-ltr">
appimageContents = appimageTools.extractType1 { inherit name src; };
in
appimageTools.wrapType1 {
  inherit name src;
</div>
 
  <div lang="en" dir="ltr" class="mw-content-ltr">
extraInstallCommands = ''
    mv $out/bin/${name} $out/bin/${pname}
    install -m 444 -D ${appimageContents}/${pname}.desktop -t $out/share/applications
    substituteInPlace $out/share/applications/${pname}.desktop \
      --replace-fail 'Exec=AppRun' 'Exec=${pname}'
    cp -r ${appimageContents}/usr/share/icons $out/share
  '';
</div>
 
  <div lang="en" dir="ltr" class="mw-content-ltr">
meta = {
    description = "Viewer for electronic invoices";
    homepage = "https://github.com/ZUGFeRD/quba-viewer";
    downloadPage = "https://github.com/ZUGFeRD/quba-viewer/releases";
    license = lib.licenses.asl20;
    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
    maintainers = with lib.maintainers; [ onny ];
    platforms = [ "x86_64-linux" ];
  };
}
</syntaxhighlight>
</div>
 
<div lang="en" dir="ltr" class="mw-content-ltr">
== Configuration ==
</div>
 
<div lang="en" dir="ltr" class="mw-content-ltr">
=== Register AppImage files as a binary type to binfmt_misc ===
</div>
</div>


Line 38: Line 104:
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
This way AppImage files can be invoked directly as if they were normal programs
This way AppImage files can be invoked directly as if they were normal programs
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
== How AppImage files are packaged by NixOS ==
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
See the [https://nixos.org/manual/nixpkgs/stable/#sec-pkgs-appimageTools nixpkgs manual on wrapping AppImage packages]. In short, the AppImage is extracted and any dependencies are added as nix build dependencies.
</div>
</div>


[[Category:Software{{#translation:}}]]
[[Category:Software{{#translation:}}]]

Latest revision as of 08:24, 14 August 2024

AppImage is a monolithic packaging format for linux applications. It contains all dependencies in one file that is composed of an executable with a tacked on filesystem.

Usage

Run

On most distros, all one has to do is download the .AppImage file, make it executable chmod +x $AppImage, and execute it. This doesn't work in NixOS out of the box though, as AppImage files usually (if not always) depend on certain system libraries in hardcoded paths.

$ nix-shell -p appimage-run
$ appimage-run $AppImageFile

Packaging

See the nixpkgs manual on wrapping AppImage packages. In short, the AppImage is extracted and any dependencies are added as nix build dependencies.

Following example is a derivation for the program Quba, which is also distributed as AppImage.
{
  lib,
  appimageTools,
  fetchurl,
}:
</div>

<div lang="en" dir="ltr" class="mw-content-ltr">
let
  version = "1.4.0";
  pname = "quba";
  name = "${pname}-${version}";
</div>

  <div lang="en" dir="ltr" class="mw-content-ltr">
src = fetchurl {
    url = "https://github.com/ZUGFeRD/quba-viewer/releases/download/v${version}/Quba-${version}.AppImage";
    hash = "sha256-EsTF7W1np5qbQQh3pdqsFe32olvGK3AowGWjqHPEfoM=";
  };
</div>

  <div lang="en" dir="ltr" class="mw-content-ltr">
appimageContents = appimageTools.extractType1 { inherit name src; };
in
appimageTools.wrapType1 {
  inherit name src;
</div>

  <div lang="en" dir="ltr" class="mw-content-ltr">
extraInstallCommands = ''
    mv $out/bin/${name} $out/bin/${pname}
    install -m 444 -D ${appimageContents}/${pname}.desktop -t $out/share/applications
    substituteInPlace $out/share/applications/${pname}.desktop \
      --replace-fail 'Exec=AppRun' 'Exec=${pname}'
    cp -r ${appimageContents}/usr/share/icons $out/share
  '';
</div>

  <div lang="en" dir="ltr" class="mw-content-ltr">
meta = {
    description = "Viewer for electronic invoices";
    homepage = "https://github.com/ZUGFeRD/quba-viewer";
    downloadPage = "https://github.com/ZUGFeRD/quba-viewer/releases";
    license = lib.licenses.asl20;
    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
    maintainers = with lib.maintainers; [ onny ];
    platforms = [ "x86_64-linux" ];
  };
}

Configuration

Register AppImage files as a binary type to binfmt_misc

You can tell the Linux kernel to use an interpreter (e.g. appimage-run) when executing certain binary files through the use of binfmt_misc, either by filename extension or magic number matching. Below NixOS configuration registers AppImage files (ELF files with magic number "AI" + 0x02) to be run with appimage-run as interpreter.

Since NixOS 24.05, there is a binfmt option:

programs.appimage = {
  enable = true;
  binfmt = true;
};

This way AppImage files can be invoked directly as if they were normal programs