# Linux 发行版支持

## 概述

Wails 提供 Linux 支持，但为所有可用发行版提供安装说明是一项不可能完成的任务。 相反，Wails 会尝试确定您开发应用程序所需的包是否可以通过系统的包管理器获得。 目前，我们支持以下包管理器：

- apt
- dnf
- emerge
- eopkg
- nixpkgs
- pacman
- zypper

## 添加包名

在某些情况下，您的发行版使用受支持的包管理器之一，但包名称不同。 例如，您可能使用 Ubuntu 衍生产品，但 gtk 的包名称可能不同。 Wails 尝试通过遍历包名称列表来找到正确的包。 包列表存储在 `v2/internal/system/packagemanager` 目录中的包管理器特定文件中。 在我们的示例中，是 `v2/internal/system/packagemanager/apt.go`。

在此文件中，包列表由以下 `Packages()` 方法定义：

```go
func (a *Apt) Packages() packagemap {
    return packagemap{
        "libgtk-3": []*Package{
            {Name: "libgtk-3-dev", SystemPackage: true, Library: true},
        },
        "libwebkit": []*Package{
            {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true},
        },
        "gcc": []*Package{
            {Name: "build-essential", SystemPackage: true},
        },
        "pkg-config": []*Package{
            {Name: "pkg-config", SystemPackage: true},
        },
        "npm": []*Package{
            {Name: "npm", SystemPackage: true},
        },
        "docker": []*Package{
            {Name: "docker.io", SystemPackage: true, Optional: true},
        },
    }
}
```

假设在我们的 linux 发行版中，`libgtk-3` 以 `lib-gtk3-dev` 的名称打包。 我们可以通过添加以下行来添加对此的支持：

```go {5}
func (a *Apt) Packages() packagemap {
    return packagemap{
        "libgtk-3": []*Package{
            {Name: "libgtk-3-dev", SystemPackage: true, Library: true},
            {Name: "lib-gtk3-dev", SystemPackage: true, Library: true},
        },
        "libwebkit": []*Package{
            {Name: "libwebkit2gtk-4.0-dev", SystemPackage: true, Library: true},
        },
        "gcc": []*Package{
            {Name: "build-essential", SystemPackage: true},
        },
        "pkg-config": []*Package{
            {Name: "pkg-config", SystemPackage: true},
        },
        "npm": []*Package{
            {Name: "npm", SystemPackage: true},
        },
        "docker": []*Package{
            {Name: "docker.io", SystemPackage: true, Optional: true},
        },
    }
}
```

## 添加新的包管理器

要添加新的包管理器，请执行以下步骤：

- 在 `v2/internal/system/packagemanager` 中创建一个名为 `<pm>.go` 的新文件，其中 `<pm>` 是包管理器的名称。
- 定义一个符合 `pm.go` 中定义的包管理器接口的结构体。

```go
type PackageManager interface {
    Name() string
    Packages() packagemap
    PackageInstalled(*Package) (bool, error)
    PackageAvailable(*Package) (bool, error)
    InstallCommand(*Package) string
}
```

- `Name()` 应该返回包管理器的名称
- `Packages()` 应该返回一个 `packagemap`，它为依赖项提供候选文件名
- `PackageInstalled()` 如果安装了指定的包，应该返回`true`
- `PackageAvailable()` 如果指定的软件包未安装但可以安装，则应返回`true`
- `InstallCommand()` 应该返回确切的命令来安装指定的包名

查看其他包管理器代码以了解其工作原理。

:::info 记住

如果您添加了对新包管理器的支持，请不要忘记更新此页面！

:::
