NixOSでGitパッケージにドキュメントを追加するには?

NixOSでGitパッケージにドキュメントを追加するには?

git help some-aliasエイリアス構成値を印刷します。たとえば、次のようになります。

$ git help aliases
'aliases' is aliased to '!git config --get-regexp '^alias\.' | cut --delimiter=. --fields 2-'

他のエイリアスと同様に、このエイリアスと他のエイリアスについて詳細なヘルプを提供したいと思いますgit help diff。これまで私これ:

{
  config.programs.git.package = pkgs.gitFull.overrideAttrs (
    old: {
      postInstall =
        old.postInstall
        + ''
          cp ${./includes/git-aliases/docs}/* $doc/share/doc/git/
        '';
    }
  );
}

一部のテキストファイルが正常にコピーされましたが、/nix/store/[git package]-doc/share/doc/git/実行時にこれらのファイルが表示されませんでしたgit help aliases

help文書をサブコマンドにリンクするにはどうすればよいですか?一部のファイルレジストリを更新しますか?.htmlCLI文書のみを希望する場合でもファイルを追加する必要がありますか?他にはありませんか?

ベストアンサー1

したがって、ほとんどの場合、Nixは通常のFHS展開と同じ方法でファイルを配置します。ただし、パスプレフィックスを追加し/nix/store/somehash-somename/(ビルド時に同じを使用$out)、一部のパスを削除します。たとえば、FHSディストリビューションでは、次のものと/usr/本質/usr/local的に同じ構造が含まれています。/ ユーザーがインストールしたプログラムの場合/usr(nixでは必要ありません)nixはおよびプレフィックスを削除します/usr/local。 nixを簡単に設定し$PREFIX=/nix/store/somehash-somename/(通常はデフォルト/usr/local)、ほとんどの既存のautotools / cmake / makeスクリプトをそのまま実行できるので、これは非常に実用的です。

特に一般的なFHSディストリビューションではマニュアルページがにあるので、/usr/share/mannixでは単にマニュアルページを にインストールします$out/share/man

今、特定の問題を解決するための最も難しいのは、実際にgitがコマンドのドキュメントを見つける方法を理解することです。そのコマンドについて言及したので、git diffgitフォルダをチェックしてドキュメントファイルが保存されている場所を見つけてみましょう。

$ nix-build -E 'let pkgs = import <nixpkgs> {}; in pkgs.gitFull'
/nix/store/hvl0fxxkva3ql9ksiy8p8pl3cxli24l8-git-with-svn-2.39.0
$ cd /nix/store/hvl0fxxkva3ql9ksiy8p8pl3cxli24l8-git-with-svn-2.39.0
# fd is a really cool tool to quickly search files based on their name
$ fd diff
share/man/man1/git-diff.1.gz

ビンゴ、文書が単純なmanファイルのようです。実際に以下を実行すると:

$ git help mytest
No manual entry for gitmytest

gitを直接実行しているようですman gitmytest(ここでダッシュがもう含まれていないのはわかりません...)。mytest既存のgitコマンドでなくても動作するようです。だから私たちはman項目を作成するだけですgitmytest

これを行うには、新しいファイルにこのテンプレートを作成しましょうgit-mytest(マンページの生成方法を検索して取得できます)。

.\" Manpage for git mytest.
.TH man 1 "06 May 2010" "1.0" "git mytest man page"
.SH NAME
git mytest \- test to document random git commands
.SH SYNOPSIS
git mytest [USERNAME]
.SH DESCRIPTION
git mytest is a non-existing command that I use to do some tests.
.SH OPTIONS
Since it does not even exists, there is little chance it has options.
.SH SEE ALSO
useradd(8), passwd(5), nuseradd.debian(8) 
.SH BUGS
No known bugs.
.SH AUTHOR
Tobias Bora ([email protected])

次に、それをインストールするための基本パッケージを作成するだけです。上書きする必要はなく、gitFull新しいパッケージを作成して別のパッケージにインストールできます。私のテストでは、default.nix次の内容を含むファイルを使用します。

{ pkgs ? import <nixpkgs> {} }:
pkgs.stdenv.mkDerivation {
  name = "git-mytest";
  src = ./.;
  buildPhase = "";
  installPhase = ''
    mkdir -p $out/share/man/man1
    cp $src/git-mytest $out/share/man/man1/gitmytest.1
  '';
}

これをビルドし、ファイルが正しく作成されたことを確認できます。

$ nix-build
$ ls ./result/share/man/man1
gitmytest.1.gz

素敵ですね。 nixから私たちのために圧縮までしました。内容が正しいことを再確認するには、これを実行するとzcat ./result/share/man/man1/gitmytest.1.gz圧縮されていないファイルが印刷されます。

今試してみる時間です。 1つの解決策は、上記の派生物をユーザーconfiguration.nixまたは他の場所に挿入してシステム全体に直接インストールすることです。しかし、テスト目的でグローバルインストールを避けたかったので、shell.nix作成したパッケージをロードするプログラムを作成しました。

{ pkgs ? import <nixpkgs> {} }:
with pkgs;
let mantest = import ./default.nix { inherit pkgs; }; in
pkgs.mkShell {
  packages = [ mantest ];
  buildInputs = [ ];
  shellHook = ''
    echo "Exporting manpage path"
    export MANPATH=${mantest}/share/man:$MANPATH
  '';
}

以下を追加したことがわかります。この行は、実際にこのテストでマニュアルページを見つける場所をshellHook指定するためにのみ必要です。manしかし、実際にプログラムをインストールすればもう必要ありません。

次に、シェルをロードしてテストします。

$ nix-shell
$ git help mytest
# you should get the man page printed!

効果がある!楽しむ;-)

編集する エイリアスが生成されると、上記の指示が機能しないようです。この場合、メッセージは常に同じですmyalias is aliased to XXX。これはから来ていますこの行コードではこれを避けるための直接的な方法がないようです。しかし、エイリアスを作成する代わりに、単に新しいgitプラグインを作成することができます(ログが必要な場合はエイリアスを作成するのが合理的かもしれません)。つまり、呼び出されたプラグインgit-mytest(実行時にgit mytestgitが自動的に実行するgit-mytest)です。git-mytestgitを直接呼び出す単純なbashスクリプトです。これは次のように行うことができます(今回はハイフンを書く必要がありますマニュアルページでは、コマンドの種類によって異なるマニュアルページ名を提供しているようです。

{ pkgs ? import <nixpkgs> {} }:
pkgs.stdenv.mkDerivation {
  name = "git-mytest";
  src = ./.;
  buildPhase = "";
  installPhase = ''
    mkdir -p $out/share/man/man1
    mkdir -p $out/bin
    # "git mytest" will run "git-mytest", so we just need to create a binary called "git-mytest"
    # (nix will automatically patch /bin/bash, so it's fine to use here, the "$@$ in the bash forwards the argument to the command)
    echo '#!/bin/bash' > $out/bin/git-mytest
    echo 'git log --all --graph "$@"' >> $out/bin/git-mytest
    chmod +x $out/bin/git-mytest
    # Installs the documentation for the command
    # this time, if the command exists, you do need a "-"
    cp $src/git-mytest $out/share/man/man1/git-mytest.1
  '';
}

default.nix上記のファイルをこれに置き換えてやり直してくださいnix-shell。その後、次のように入力できる必要があります。

$ git mytest
# runs git log --all --graph

$ git help mytest
# prints the man page

$ git mytest -h
# Prints the help of "git log" since for now we forward the arguments.
# If you want "git mytest -h" to print a different message, just search for "-h" in the arguments in the bash script and run for instance "man git-mytest" yourself.

おすすめ記事