일반화하다

일반화하다

일반화하다

--ignore=<regex>제가 입력한 라인이 .stowrc작동하지 않습니다. Stow를 실행할 때 ".stowrc에서 기본값을 로드하는 중"이라는 메시지가 표시되지만 아무런 효과가 없습니다. 그러나 --ignore=<regex>해당 행을 명령에 직접 전달하면 작동합니다.

질문

다음 디렉터리를 가정합니다.

user@user-machine:~/test-stow/stow$ tree -a
.
├── a
│   └── car
└── .stowrc

1 directory, 2 files

콘텐츠 ./.stowrc:

--ignore='car'

그래서 내 기대는 해당 디렉토리에서 명령을 실행하는 것이 stow --verbose=3 a/파일이 존재하지 않을 때 실행하는 것과 동일하다는 것입니다 stow --ignore='car' --verbose=3 a/../.stowrc

이제 다음을 실행합니다.

user@user-machine:~/test-stow/stow$ stow --verbose=3 a
Loading defaults from .stowrc
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package a...
Stowing contents of stow/a (cwd=~/test-stow)
Stowing stow/a/car
LINK: car => stow/a/car
Planning stow of package a... done
cwd restored to /home/user/test-stow/stow
Processing tasks...
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
Processing tasks... done

이 점에 유의하시기 바랍니다하다./car그래도 심볼릭 링크를 만드세요 .ignore./.stowrc

이제 다음을 실행하여 작업을 취소합니다 stow -D --verbose=3 a/.

user@user-machine:~/test-stow/stow$ stow -D --verbose=3 a/
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
Planning unstow of package a...
Unstowing from . (cwd=~/test-stow, stow dir=stow)
Unstowing stow/a/car
car did not exist to be unstowed
Planning unstow of package a... done
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
Processing tasks...

모든 것을 제거 ./.stowrc하고 실행하면 stow --verbose=3 --ignore='car' a/다른 결과가 나타납니다.

user@user-machine:~/test-stow/stow$ stow --verbose=3 --ignore='car' a/
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package a...
Stowing contents of stow/a (cwd=~/test-stow)
Planning stow of package a... done
cwd restored to /home/user/test-stow/stow
Processing tasks...

심볼릭 링크 ./car는 이제아니요예상대로, 예상대로 생성되었습니다.

무엇에 대해 $HOME/.stowrc?

.stowrc대신 파일을 홈 디렉터리에 배치하면 파일에 대한 기호 링크가 계속 생성되는 것과 $HOME/test-stow/stow동일한 효과가 있습니다 .car

무시 목록

$HOME/test-stow/stow/.stow-local-ignore그 대신 "car"라는 내용이 포함된 파일을 사용하는 .stowrc것도 작동하지 않습니다. car파일에 대한 심볼릭 링크는 여전히 생성됩니다.


GNU 저장소 버전:2.2.0
펄 버전:펄 5, 버전 18

고쳐 쓰다

여기이것은 Adam Spears의 답변에 대한 나의 답변입니다.

답변1

훌륭한 버그 보고서를 보내주셔서 감사합니다! 저는 귀하의 질문에 답할 수 있고 Stow 관리자로서 이를 해결할 수 있습니다. 하지만 우리가 최상의 솔루션을 찾을 수 있도록 사용자 경험 관점에서 피드백을 제공해 주시면 감사하겠습니다.

첫째, 무시 메커니즘의 내부에 대한 자세한 내용을 제공한다는 점에 주목할 가치가 있습니다 --verbose=5. 하지만 이 경우에는 상황이 예상대로 작동하지 않는 이유를 설명하는 것만으로는 충분하지 않습니다.

두 파일 모두 작동하지 않는 데는 두 가지 이유가 있습니다 .stowrc.

  1. 파서는 .stowrc대신 공백 문자를 기준으로 (옵션, 값) 쌍을 분할합니다 =. 따라서 옵션을 무시하는 이 파일의 줄은 --ignorenot 로 시작 해야 합니다 --ignore=.
  2. 파서는 .stowrc자동으로 따옴표를 제거하지 않습니다. --ignore옵션(또는 다른 옵션)이 CLI를 통해 전달되면 쉘은 Stow가 보기 전에 따옴표를 제거합니다 . 그것이 그곳에서 작동하는 이유입니다.

따라서 이 두 가지의 조합은 다음을 .stowrc포함해야 함을 의미합니다.

--ignore car

나는 그것을 테스트했고 작동합니다.

이제 이 두 가지 사항 중 하나 또는 둘 다 실제로 사용자 경험 버그라는 유효한 주장이 있을 수 있습니다. 나는 그들이 직관적인 사용자 인터페이스를 제공하지 않는다는 점에 확실히 동의합니다. 문제는 동작을 변경해야 하는지, 아니면 문서에 이를 더 명확하게 기술하는 것이 더 나은지 여부입니다.

나의 현재 생각은 다음을 기반으로합니다.포스텔의 법칙, 파서는 공백 및 의 분할을 허용해야 =하지만 따옴표를 제거해서는 안 됩니다. 'car'사용자가 실제로 무시하는 것이 아니라 무시하기를 원하면 어떻게 될까요 car? 기존 및 관련 항목도 있습니다.공백이 깨지는 옵션에 대한 버그 보고stowrc, 따라서 수정 사항을 구현할 때 이 점을 고려해야 합니다. (이 답변을 게시한 후 오류를 업데이트하겠습니다.)

이에 대한 귀하의 의견을 환영합니다.

마지막으로, 패키지 디렉터리 .stow-local-ignore대신 stow 디렉터리에 저장했기 때문에 귀하의 접근 방식이 작동하지 않는다고 생각합니다 . a/이에 대한 문서는 나에게 매우 명확해 보이므로 파일럿 버그로 작성하는 것이 공정하다고 생각합니다. 그러나 문서를 더 명확하게 만드는 방법에 대한 제안 사항이 있으면 언제든지 귀를 기울이겠습니다.

다시 한 번 감사드립니다! 그런데, 앞으로는 다음으로 버그 보고서를 보내는 것을 고려할 수 있습니다.메일링 bug-stow리스트(또는끔찍하지만 도덕적으로 올바른 사바나 버그 추적기또는덜 윤리적이지만 더 유용한 github 문제 추적기) 및 도움 요청메일링 help-stow리스트. 예, 다음 날 해야 할 일 목록인 작고 조용한 프로젝트에 비해 옵션이 너무 많다는 것을 알고 있습니다.

관련 정보