내 프로그램에 프로그램을 추가하고 싶지만 $PATH
해당 코드가 여러 파일로 분할되어 lib/
런타임 시 루트 디렉터리에서 가져옵니다.
projectRootDirectory
├ programBinary
└ lib
├ someLibrary
└ someLibrary2
$PATH
종속성 누락에 대한 불만을 제기하지 않고 내 프로그램에 이와 같은 것을 어떻게 추가할 수 있습니까 ?
나는 보통 바이너리 파일 /usr/local/bin
을
복사
cp /path/to/programBinary /usr/local/bin
또는 심볼릭 링크
cd /usr/local/bin ln -s /path/to/programBinary programBinary
그러나 둘 다 종속성을 찾을 수 없게 만듭니다.
필요한 파일 중 /usr/local/bin
일부도 실행 가능하고 내 $PATH
.
어떻게 해야 합니까?
답변1
물론 projectRootDirectory
에 추가할 수도 있지만 $PATH
여기에는 적어도 두 가지 단점이 있습니다.
bin
당신이 설명하는 방식에 따르면 이 특정 프로젝트는 다음과 같이 프로젝트를 하위 디렉터리 로 잘 구성하지 않는 것 같습니다lib
.projectRootDirectory ├ bin │ └ programBinary └ lib ├ someLibrary └ someLibrary2
그래서 강제로
projectRootDirectory
그 자체에 넣어야 하는데$PATH
, 실행을 위한 바이너리 외에 다른 것이 포함되어 있기 때문에 좀 보기 흉합니다.비슷한 프로젝트가 많으면 콘텐츠가
$PATH
폭발적으로 늘어나 통제할 수 없게 됩니다.
대신, 아마도 이 특별한 경우에 할 수 있는 가장 쉬운 일은 래퍼 실행 파일을 에 넣는 것입니다 /usr/local/bin
. 이는 현재 위치에서 "실제" 프로그램을 실행하는 매우 간단한 쉘 스크립트입니다.
#!/bin/sh
exec projectRootDirectory/programBinary "$@"
래퍼 스크립트는 전체 경로 이름을 사용하여 이를 호출하므로 일반적인 방법으로 보조 파일을 찾을 수 있습니다.
답변2
다양한 수준의 복잡성을 지닌 이 문제를 해결하는 방법은 여러 가지가 있으며, 가장 효과적인 방법은 "포장 철학"에 따라 다릅니다.
/usr/local/bin
아마도 제가 선택할 접근 방식은 내보낸 변수(라이브러리 경로에 따라 수정됨)를 설정하고 라이브러리 경로에서 기본 프로그램을 호출하는 것 외에는 아무것도 수행하지 않는 래퍼 스크립트를 디렉터리에 배치하는 것 입니다 PATH
. 이 경우 모든 실행 파일은 디렉터리에 상주합니다. lib 디렉토리만 가능합니다 /usr/local/bin
. (로컬로 정의된 PATH
변수는 호출 프로세스에서만 상속되며 호출 환경을 오염시키지 않습니다.)