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
문서를 하위 명령 에 연결하려면 또 무엇을 해야 합니까 ? 일부 파일 레지스트리를 업데이트하시겠습니까? .html
CLI 문서만 원하는 경우에도 파일을 추가해야 합니까? 다른 건 없나요?
답변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/man
nix에서는 간단히 매뉴얼 페이지를 에 설치합니다 $out/share/man
.
이제 특정 문제를 해결하기 위해 가장 어려운 부분은 실제로 git이 명령에 대한 문서를 찾는 방법을 이해하는 것입니다. 해당 명령을 언급했으므로 git diff
git 폴더를 확인하여 문서 파일이 저장되는 위치를 찾아보겠습니다.
$ 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
하면 압축되지 않은 파일이 인쇄됩니다.
이제 시도해 볼 시간입니다. 한 가지 해결책은 위의 파생물을 사용자 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 mytest
git이 자동으로 실행함 git-mytest
)입니다. git-mytest
git을 직접 호출하는 간단한 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.