{ description = "Python OneBot11"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; deploy-rs.url = "github:serokell/deploy-rs"; pyproject-nix = { url = "github:pyproject-nix/pyproject.nix"; inputs.nixpkgs.follows = "nixpkgs"; }; uv2nix = { url = "github:pyproject-nix/uv2nix"; inputs.pyproject-nix.follows = "pyproject-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; pyproject-build-systems = { url = "github:pyproject-nix/build-system-pkgs"; inputs.pyproject-nix.follows = "pyproject-nix"; inputs.uv2nix.follows = "uv2nix"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, deploy-rs, pyproject-nix, uv2nix, pyproject-build-systems, ... }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; inherit (nixpkgs) lib; forAllSystems = lib.genAttrs lib.systems.flakeExposed; workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; }; overlay = workspace.mkPyprojectOverlay { sourcePreference = "wheel"; }; editableOverlay = workspace.mkEditablePyprojectOverlay { root = "$REPO_ROOT"; }; pythonSets = forAllSystems ( system: let pkgs = nixpkgs.legacyPackages.${system}; python = pkgs.python3; in (pkgs.callPackage pyproject-nix.build.packages { inherit python; }).overrideScope ( lib.composeManyExtensions [ pyproject-build-systems.overlays.wheel overlay ] ) ); pyonebot-service = (pkgs.formats.ini { }).generate "pyonebot.service" { Unit = { Description = "PyOneBot Service"; }; Service = { ExecStart = "${self.packages.${system}.default}/bin/pyonebot"; WorkingDirectory = "${self.packages.${system}.default}/share/pyonebot/"; Restart = "always"; }; Install = { WantedBy = "default.target"; }; }; in { packages = forAllSystems (system: { default = let pyonebot = pythonSets.${system}.mkVirtualEnv "pyonebot" workspace.deps.default; in pkgs.runCommand "pyonebot" { } '' # 把虚拟环境里的东西全链接过来 mkdir -p $out ln -s ${pyonebot}/* $out/ # 把你的整个源码目录拷贝到 $out/share/pyonebot mkdir -p $out/share/pyonebot cp -r ${./.}/* $out/share/pyonebot/ ''; }); # 远程部署 deploy.nodes.macmini = { hostname = "ssh.colorsky.fun"; profiles.pyonebot = { user = "sky"; path = deploy-rs.lib.${system}.activate.custom (pkgs.runCommand "pyonebot-service" { } '' mkdir -p $out/lib/systemd/user cp ${pyonebot-service} $out/lib/systemd/user/pyonebot.service '') '' mkdir -p ~/.config/systemd/user/ ln -sf $PROFILE/lib/systemd/user/pyonebot.service ~/.config/systemd/user/pyonebot.service systemctl --user daemon-reload systemctl --user enable pyonebot.service systemctl --user restart pyonebot.service ''; }; }; checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib; devShells."${system}".default = let pkgs = import nixpkgs { inherit system; }; in pkgs.mkShell { packages = with pkgs; [ python312 pyright ]; shellHook = '' # run some script here. ''; }; }; }