라이브러리 폴더보다 패키지 관리자를 선호하는 이유는 무엇입니까?


68

정적 라이브러리 폴더와 패키지 관리자의 장단점을 생각할 때 라이브러리 폴더가 더 나은 방법이라고 생각합니다.

라이브러리 폴더로 볼 수있는 장점 :

  1. 패키지를 관리하기 위해 외부 도구가 필요하지 않습니다.
  2. 인터넷 연결이 필요하지 않습니다.
  3. 빠른 빌드 (패키지 확인 안 함)
  4. 더 간단한 환경 (지식이 필요하지 않음).

패키지 관리자와 함께하는 장점 :

  1. 복잡한 종속성 트리를 지원하고 모든 종속성과 함께 종속성을 다운로드하여 관리 할 수 ​​있습니다.
  2. 사용 가능한 새 버전이 있는지 확인하는 데 도움이됩니다.

업계는 오늘날 구축 된 거의 모든 것에 대해 패키지 관리자 경로를 따르기로 결정한 것 같습니다. 그래서, 내가 무엇을 놓치고 있습니까?


33
번들링 과 라이브러리 요구 의 이점에 대해 실제로 묻는 것 같습니다 . 해당 용어를 사용하면 더 관련성 높은 답변을 얻을 수 있습니다.
Kilian Foth

3
필요한 모든 것을 포함하고 아마도 인터넷 액세스를 전혀 허용하지 않는 (빌드에 필요하지 않은) 빌드 에이전트에 대한 도커 컨테이너를 만드는 것을 방해하는 이유는 무엇입니까? 실제로 인수를 고려하는 것보다 새로운 도구를 배우는 데 더 반대한다고 생각합니다. 수동 관리 종속성을 사용하는 대규모 프로젝트를 수행 한 적이 있습니까? 당신이 보이는 것처럼 좋지 않습니다.
Kayaman

3
@Kayaman : 새로운 도구를 배우려면 팀의 시간 (돈)이 소요되며 올바른 도구에 투자하고 있는지 확인하고 싶습니다. 대규모 프로젝트에 대한 나의 경험은 의존성이 상당히 안정적이며 [거의 변경되지 않음] 패키지 관리자가 비용이 많이 드는 이유 일 수 있습니다. 어쨌든 나는 Nuget과 잠시 일하고 시간을 보낸 후에 프로와 콘을 나열했습니다.
Ignacio Soler Garcia

2
@sebkur 모든 패키지의 로컬 사본을 보관할 수 있습니다. 우리는 모든 종속성의 현재 버전을 로컬 소스 제어하에 유지합니다. 패키지 관리자가 연결을 필요로하는 유일한 시간은 업그레이드 할 때입니다.
17 of 26

1
@ 17of26 : nuget을 설치하고 요청시 10 분 안에 빌드 에이전트를 실행하도록 빌드 에이전트를 구성하는 방법을 배우지 못했습니다. 다른 솔루션에서 동일한 프로젝트가 사용되는 다중 솔루션 프로젝트가있는 경우에도 마찬가지입니다.
이그나시오 솔러 가르시아

답변:


122

다른 답변에서 누락 된 중요한 점 :

패키지 관리자를 사용한다는 것은 사용중인 라이브러리 버전 을 나타내는 구성이 있으며 구성 정보가 실제로 올바른지 확인하는 것입니다.

다음과 같은 경우 사용하는 라이브러리와 버전을 아는 것이 매우 중요합니다.

  • 중요한 버그 / 보안 결함으로 인해 라이브러리를 업데이트해야합니다.
  • 또는 공지 된 보안 허점이 귀하에게 영향을 미치는지 확인해야합니다.

또한 실제로 업데이트 할 때 패키지 관리자는 일반적으로 전이 종속성을 필요에 따라 업데이트합니다.

A를 반면 lib폴더, 당신은 (아마도 이진, 그리고 아마도 수정) 파일의 무리가 있고, 당신은 그들이 어디에서 왔는지 추측해야하고 어떤 버전 그들이 (또는 README, 또는 정확하지 않을 수 있습니다 믿을거야 ).


다른 요점을 해결하려면 :

패키지를 관리하기 위해 외부 도구가 필요하지 않습니다.

그러나 a) 소프트웨어 개발자는 많은 도구를 설치해야하므로 대개 더 중요하지 않으며 b) 일반적으로 특정 필드 (Maven / Gradle for Java, JS / TypeScript 등의 경우 npm) 수십 개를 설치 해야하는 것은 아닙니다.

인터넷 연결이 필요하지 않습니다.

내가 아는 모든 패키지 관리자는 필요한 종속성을 다운로드하면 오프라인으로 작업합니다 (프로젝트 자체를 다운로드 한 직후에 발생할 수 있음).

빠른 빌드 (패키지 확인 안 함)

아마도 사실이지만 오프라인 패키지 확인에 많은 시간이 걸리지 않을 것 같습니다 (일부 버전 번호를 비교하는 것입니다). 온라인 검사는 시간이 걸릴 수 있지만, 원하는 경우 (기본값도에있는 경우 - 메이븐 예를 들어 릴리스 버전에 대한 업데이트를 확인하지 않음) 그 해제 할 수 있습니다.

더 간단한 환경 (지식이 필요하지 않음).

사실이지만 위에서 설명한 것처럼 lib폴더에도 지식이 필요합니다. 또한 위에서 설명한 바와 같이, 이미 알고있는 소수의 다른 패키지 관리자 만 사용할 수 있습니다.


170
“패키지를 관리하기 위해 외부 도구가 필요하지 않습니다”— yup. 이제 당신의 두뇌 직업입니다. 행운을 빌어 요, 뇌!
Paul D. Waite

57
lib 폴더를 갖는 것이 "보다 쉬운 환경"이라고 진지하게 생각하는 사람이라면 간단히 Microsoft.AspNetCore.All nuget 이라는 종속성 트리를 찾아보십시오 . 잠깐만 기다리세요. 하루 정도면 다시 확인하겠습니다.
Voo

13
또한 라이브러리를 수동으로 찾아내는 데 사용하는 인터넷 브라우저는 패키지를 관리하는 외부 도구로 간주됩니다. 라이브러리를 준비하고 배치하기 위해 사용하는 다른 모든 것 (OS 파일 관리자 등)과 함께. 따라서 실제 선택은 외부 도구 (패키지 관리자) 대 많은 도구입니다.
NemesisX00

3
참고로 최근 오프라인 PC에서 gradle을 사용하려고했습니다. 운 좋게도 Android Studio는 내 응용 프로그램을 실행하지 않으며 모호한 오류 메시지가 표시되며 종속성에 대해 온라인으로 처음 실행 한 후입니다. 소프트웨어를 만드는 패키지 관리자에 대한 의존도가 얼마나
높아 졌는지

7
@ PaulD.Waite 우리가있는 동안, 우리는 모든 사람들이 진행하는 성가신 "언어"를 제거했습니다. 어쨌든 결국 모두 기계 코드로 귀결됩니다. 그래서 우리 회사에서는 중개인을 잘라 냈습니다. 이제 효율성입니다!
corsiKa

39

소규모 개발에서 더 큰 작업으로 이동하면 lib 폴더의 장점이 빠르게 사라집니다.

예를 들어, 외부 도구를 필요로하지 않는 "혜택"은 종속성을 수동으로 관리하는 데 필요한 작업보다 우선합니다. 따라서 도구는 여러분이 될 것입니다 (하나 이상의 의미에서).

패키지 관리자를위한 인터넷 연결이 필요하지 않습니다. 로컬 리포지토리를 사용할 수 있습니다.

더 빠른 빌드는 사실이지만 패키지 관리자 사용 여부를 결정하는 것은 아닙니다. 우리는 결국 차이의 크기에 대해 이야기하고 있지 않으며, 이는 구성에 따라 다릅니다. 패키지 관리자를 사용하여 느리게 빌드 할 수 있지만 기본적으로 파괴적입니다.

더 단순한 환경 (지식이 필요하지 않음)? 다시 한번, 소규모 개발에서는 확실히 가능성이 있습니다. 사용중인 몇 개의 라이브러리 각각에 이르기까지 프로젝트를 머리 속에 완전히 담을 수 있습니다. 간단한 makefile / 기타 빌드 스크립트를 추가하면 완전한 패키지가 생깁니다.

그러나 환경을 단순 하게 만들지 않고 단순한 환경에서만 작동합니다. 대규모 개발에서는 사용자 지정 솔루션 대신 표준 툴링을 사용하게되어 기쁩니다. 결국, 당신은 그것을 한 번만 배워야합니다 (패키지 관리자 du jour가 새로운 멋진 것으로 대체되면 그것을 배워야합니다).


21
@IgnacioSolerGarcia : 문제가없는 경우에만 더 쉽습니다. 새 버전의 라이브러리 A에 업데이트 된 B 및 C도 필요한 경우 어떻게합니까? 여전히 실행되지만 미묘한 버그가 발생하면 어떻게합니까? 그것은 "종속성 관리"의 모든 부분입니다.
sleske 2016 년

18
@IgnacioSolerGarcia는 "파일 다운로드"라고해서 정확한 그림을 그리지는 못합니다. "20 개의 파일을 다운로드하여 해당 버전이 호환되는지 확인하십시오"라고 가정하겠습니다. 거기에 어떤 일도 피하지 않았다. 종속성 버전을 고정하기로 결정하고 그로 인해 발생할 수있는 문제 (버그, 보안 결함)를 수용 할 준비가되지 않은 경우 패키지 업데이트는 이론적 인 상황이 아닙니다.
Kayaman

12
@IgnacioSolerGarcia "파일 다운로드"-(1) 올바른 프로젝트 웹 사이트 찾기 (일부는 github에, 일부는 sourceforge에, 일부는 자체 웹 사이트에 있음), (2) 다운로드 페이지로 이동, (3) 올바른 버전 찾기 , (4) 다운로드, (5) 압축을 풀고 어딘가에 놓습니다. 그것보다 훨씬 더 많은 일을하는 것 같습니다 blah install libfoo. 그리고 5 개의 의존성을 곱하십시오.
el.pescado

5
이 Nuget이 제대로 작동 하려면 "간단하게"어떤 파일을 다운로드해야 합니까? 그리고 이것은 기본적으로 ASP.NET Core 프로젝트를위한 가장 간단한 설정입니다. 실제로는 더 많은 종속성이 있습니다.
Voo

6
@Ignacio 가장 간단한 ASP.Net Core 응용 프로그램을 시작하고 실행하기위한 기본 메타 정보입니다. 전체 프레임 워크의 좋은 옛날에는 모든 것이 "더 쉬워졌습니다". 방대한 양의 모 놀리 식 라이브러리를 동시에 가져 왔고 업데이트를 릴리스하는 데 몇 년이 걸렸습니다. 이 모델은 기본적으로 .NET 세계뿐만 아니라 매우 좋은 이유로 더 이상 사용되지 않습니다. 하나의 특정 작업을 수행하는 많은 작은 라이브러리의 전체 모델에 익숙해지고 패키지 관리자를 사용하는 것이 정직한 전환의 가장 쉬운 부분입니다.
Voo

35

패키지 관리자의 많은 장점 이 빠져 있습니다.

  1. 패키지 관리자를 사용하면 큰 (수 메가 바이트 이상) 바이너리를 소스 제어에 체크인하지 않아도됩니다. 그렇게하는 것은 많은 소스 제어 도구에 대한 혐오입니다. 개발자가 CocoaPods를 체크인했기 때문에 몇 개월 전에 저장소가 Bit Bucket의 크기 제한에 도달했습니다. SVN에서 마이그레이션 할 때 다른 프로젝트가 이미 반쯤있었습니다. 모든 라이브러리 바이너리를 체크인하고 있었고 NuGet을 사용하지 않았기 때문입니다. 패키지 관리자는 각 개발자를 위해 즉시 패키지를 다운로드하므로이 바이너리를 체크인 할 필요가 없습니다.
  2. 호환되지 않는 파일 / 라이브러리가 혼합되는 것을 방지합니다. 업그레이드하는 동안 누군가 폴더를 올바르게 정리하지 않으면 폴더에 라이브러리 파일의 혼합 버전이 포함될 수 있습니다. 폴더의 바이너리 중 절반이 업그레이드되어 매우 이상한 버그가 발생하는 경우를 보았습니다 . (충돌조차도 없었습니다!) 문제를 파악하는 데 문자 그대로 몇 달 (인적 시간이 아니라 전체 시간)이 걸렸습니다. 패키지 관리자가 전체 폴더를 제어하게함으로써 혼합 버전을 얻을 수 없습니다. 일관성을 보장합니다. 또한 모든 것을 자동으로 업데이트하거나 필요한 곳에 다른 버전을 설치하거나 호환되지 않는 버전의 라이브러리를 사용하려고 할 때 경고 나 오류를 발생시켜 호환되지 않는 종속성 을 사용하기가 훨씬 어렵습니다 .
  3. 라이브러리 관리를위한 공유 규칙 을 설정합니다 . 새로운 개발자가 프로젝트, 팀, 회사 등에 참여하면 패키지 관리자의 규칙을 알고있을 것입니다. 즉, 코드 기반에서 라이브러리를 관리하는 방법에 대한 세부 정보를 파악하는 데 시간을 낭비하지 않아도됩니다.
  4. 리포지토리에 속하지 않는 자신의 종속성과 파일을 버전 관리하고 배포하는 표준 방법을 제공합니다. 내 응용 프로그램에 필요한 일부 큰 정적 데이터 파일에 개인적으로 활용 했으므로 이진 코드 이외의 버전을 지정하는 데 효과적입니다.
  5. 일부 패키지 관리자는 설치 중에 추가 기능을 제공합니다. NuGet은 csproj 파일에 종속성 및 컨텐츠 파일을 추가하고 구성 파일에 구성 요소를 추가 할 수도 있습니다.
  6. 패키지 목록 파일은 중앙 집중화 된 단일 위치에 라이브러리 버전을 문서화합니다. DLL을 마우스 오른쪽 버튼으로 클릭하고 사용중인 라이브러리의 버전을 파악하기 위해 버전 번호를 볼 필요가 없습니다. 파이썬에서 라이브러리 작성자는 py 파일에 버전 번호를 포함하지 않았을 수도 있으므로 라이브러리 버전을 알려줄 수도 없습니다.
  7. 시스템 전체의 종속성 설치를 권장하지 않습니다. 패키지 관리자 는 전역 설치 프로그램없이 종속성을 설치하는 일반적인 방법을 제공합니다 . 옵션이 lib 폴더 및 전역 설치 인 경우 많은 라이브러리 개발자가 직접 설정해야하는 다운로드 가능한 바이너리가 아닌 기본 설치로 라이브러리를 기본 설치하도록 선택합니다. (MS 역사는 이것을 보여줍니다. Linux의 많은 라이브러리의 경우도 마찬가지입니다.) 이것은 충돌하는 버전의 프로젝트가있을 수 있으며 일부 개발자는 자신의 lib를 갖는 것보다 훨씬 간단한 글로벌 설치를 확실히 선택할 것이기 때문에 실제로 여러 프로젝트를 관리하기가 더 어려워집니다 dir.
  8. 그들은 호스팅 및 배포를 중앙 집중화하는 경향이 있습니다. 더 이상 해당 랜덤 라이브러리의 웹 사이트에 의존 할 필요가 없습니다. 사업을 중단하더라도 성공적인 패키지 관리자 사이트에는 여전히 모든 버전이 업로드됩니다. 개발자는 새로운 라이브러리를 다운로드하기 위해 많은 웹 사이트를 찾아 다닐 필요가 없습니다. 그들은 먼저보고 다른 옵션을 찾아 갈 수있는 곳이 있습니다. 애드혹 웹 사이트의 모든 사본을 수동으로 호스팅하는 것보다 표준 방식으로 구성된 패키지를 미러링하는 것이 더 쉽습니다.

또한 "혜택"의 가치를 과대 평가하고 있습니다.

  1. 패키지를 관리하기 위해 외부 도구가 필요하지 않습니다.

    무엇에 "외부"? NuGet 실행 파일을 내 저장소로 체크인합니다. 크기가 작고 다른 바이너리를 체크인 할 필요가 없기 때문에 체크인하는 것이 괜찮은 바이너리입니다.

    pip는 현재 기본적으로 Python과 번들로 제공되며 호환되지 않는 변경 사항을 깨고 뒤로하는 것이 매우 드물기 때문에이 전선에서 문제가되지 않습니다. 어쨌든 프로젝트 외부에 Python을 설치하지 않고는 Python 코드를 개발하지 않을 것입니다.

    그들이 널리 보급 될 때까지, 패키지 관리자는 매우 안정적인 경향이 있습니다. 당신은 멀리없이 얻을 수없는 몇 가지 대부분의 프로젝트에 대한 전 세계적으로 설치 공구의 종류와 하나의 패키지 관리자는 꽤 가벼운 무게의 요구 사항입니다. 일반적으로 언어 런타임을 설치하는 것보다 훨씬 번거롭지 않습니다.

  2. 인터넷 연결이 필요하지 않습니다.

    네트워크 연결이 없으면 데이터베이스에 연결할 수 없습니다. 데이터베이스가 아마존에서 호스팅된다면 어쨌든 완전한 인터넷 연결이 필요합니다. 소스 제어를 통해 변경 사항을 푸시 및 풀하려면 인터넷 연결이 필요합니다. 빌드 서버는 네트워크 연결이 없으면 빌드 할 코드를 체크 아웃 할 수 없습니다. 이메일이 없으면 이메일을 보내거나받을 수 없습니다 . 라이브러리가 없으면 라이브러리를 다운로드하여 lib 폴더에 넣을 수 없습니다! 인터넷 연결없이 영구적으로 개발하는 것은 거의 들어 본 적이 없습니다. 필요한 경우가 드물지만 패키지 관리자가 사용할 수있는 위치로 패키지를 다운로드하여이 문제를 해결할 수 있습니다. (나는 NuGet과 pip가 간단한 폴더 또는 네트워크 드라이브에서 가져 와서 매우 기뻐한다는 것을 알고 있습니다. 다른 사람들도 가능하다고 생각합니다.)

  3. 빠른 빌드 (패키지 확인 안 함)

    자동화 된 빌드 동안 30 초, 로컬 개발 빌드 동안 5 초는 위에서 설명한 이점과의 균형이 맞습니다. 이는 혜택이 해결하는 문제와 비교할 때 일반적으로 고려할 가치가없는 사소한 시간입니다.

  4. 더 간단한 환경 (지식이 필요하지 않음).

    에 대한 패키지 관리를위한 하나의 도구 아무것도 라이브러리 관리를위한 어쨌든, 정말 공정한 비교가 아닙니다. 도구가 없으면 프로젝트에서 사용중인 사용자 정의 프로세스 를 학습해야합니다.라이브러리를 관리합니다. 즉, 기존 지식이 접근하는 새 프로젝트에 적용되는지 확실하지 않습니다. 누군가가 생각 해낸 호드 포지 접근 방식을 다루거나 자신 만의 방식으로 구성해야합니다. 모든 라이브러리를 포함하는 디렉토리이거나 훨씬 이상 할 수 있습니다. 라이브러리 체크인을 피하기 위해 누군가가 네트워크 드라이브에 라이브러리를 배치하고 유일한 버전 표시기는 폴더 이름입니다. 그 또는 전체 설치가 실제로 어떻게 더 좋습니까? 이에 비해 패키지 관리자는 발생하는 대부분의 프로젝트에 적용 할 깔끔한 규칙을 제공합니다.

공통 주제는 프로젝트 내 에서뿐만 아니라 전체에서 일관성, 문서 및 기능을 제공한다는 것입니다. 이것은 모든 사람의 삶을 단순화시킵니다.


10
"인터넷 연결없이 영구적으로 개발하는 것은 거의 들어 본 적이 없습니다." 보안상의 이유로 완전히 분리 된 네트워크에서 많은 개발이 이루어졌습니다. 예, 그것은 소리만큼 재미 있지만, 절대적으로 가능합니다. 패키지 스토리지를위한 자체 인프라 (즉, 너겟 피드)를 설정하기 만하면됩니다.
Voo

1
자체 인프라를 보유하는 것은 실제로 어떤 경우에는 의미가있는 몇 안되는 것 중 하나입니다. 어떤 이유로 든 사용할 수없는 경우 개발자가 계속 개발할 수 있도록 폴백을하는 것이 훨씬 좋습니다. (누군가가 나에게 nuget.org 또는 npm 또는 <favorite package repo 삽입>이 어떻게 그런 문제를 겪지 않았는지 말해주기 전에 다시 생각해보십시오 .)
Voo

3
@IgnacioSolerGarcia 프로젝트 별, 부서별 또는 회사 별 컨벤션을 설정하는 것이 모든 사람이 알지 못하는 컨벤션을 갖는 것보다 낫지는 않습니다. 또한 패키지 관리는 규칙을 따르는 것보다 규칙을 따르는 것이 작업을 덜 수행하므로 규칙 을 적용 하는 것이 더 좋습니다 . 또한 언급했듯이 NuGet을 직접 커밋하고 빌드 스크립트에서 호출하므로 설치하지 않아도됩니다. 빌드 서버 설치를 최소한으로 유지합니다.
jpmc26 2016 년

2
@ jpmc26 이럴 첫 번째 번호 매기기 목록은 일부 혜택을 누릴 것이라고 강조 .
Søren D. Ptæus

1
@ SørenD.Ptæus Done.
jpmc26

16

Nuget에서 수동으로 다운로드 한 라이브러리 사용에서 자동 패키지 관리로 제품을 최근에 변환 한 결과 패키지 관리자를 사용하면 큰 이점이 있다고 말할 수 있습니다.

우리의 제품은 27 개의 C # 프로젝트에 걸쳐 구현되어 있으며 오늘날의 표준으로는 상대적으로 작습니다. 타사의 일부 종속성에는 수십 개의 어셈블리가 있습니다.

Nuget 이전에 모든 종속성을 최신 버전으로 업데이트하려면 다음을 수행해야합니다.

  1. 업데이트 된 라이브러리를 모두 얻을 수있는 곳을 추적하십시오.
  2. 다운로드 및 압축 풀기 / 설치
  3. 소스 컨트롤에 새 버전 추가
  4. 프로젝트의 모든 참조를 수동으로 살펴보고 새 어셈블리를 가리 키도록 업데이트

27 개의 프로젝트와 수십 개의 종속성 어셈블리가있는이 프로세스는 오류가 발생하기 쉬우 며 몇 시간이 걸릴 수 있습니다.

이제 Nuget 사용으로 업데이트되었으므로 단일 명령으로 모두 완료되었습니다.


그게 전문가의 요점 2입니다. 어쨌든 의존성을 변경하는 것은 우리가 거의하지 않는 일입니다 (아마도 적절한 자동 회귀 테스트가 없기 때문에).
Ignacio Soler Garcia

9
종속성 업데이트는 정기적으로 수행하는 경우 훨씬 덜 고통스러운 일입니다.
17 of 26

1
이 테스트는 자동화되어 있습니까? 정확히 얼마나 오래 걸립니까? 전체 테스트 스위트를 실행하는 데 24 시간이 걸리더라도, 실제로는 자주 그렇게하지는 않더라도 며칠마다 적은 단점으로 종속성을 업데이트 할 수 있습니다. 수동 설치를 사용하고 피할 수없는 경우에도 수동 설치를 사용하면 종속성의 일부 종속성을 놓 쳤기 때문에 실패한 것을 찾기 위해 테스트를 실행하는 데 며칠을 소비 할 수 있으며 설치 후 다시 시작해야합니다. 패키지 관리 사용 ...
Sean Burton

3
새 소프트웨어 릴리스에서 회귀 테스트가 필요하지 않습니까? 이미 릴리스 테스트를 수행 할 때 종속성을 업데이트하기 만하면됩니다.
26 중 17

4
"우리는 그것들을 완전히 자동화하지는 않았고 도구가 너무 커서 그것을 테스트하거나 자동화하는 데 몇 달이 걸릴 수 있습니다" -큰 문제가 있습니다. 이러한 테스트는 시작한 이후에 이루어져야합니다. 문제는 패키지 관리자를 사용하는 것이 아무런 이점을 제공하지 않는다는 것입니다. 문제는 작업중인 컨텍스트가 다른 방식으로 너무 어려워서 즐길 수 없다는 것입니다.
Ant P

14

패키지 관리를위한 외부 도구 불필요

그것은 일종의 논 포인트입니까? 패키지 관리자를 사용하는 경우 lib 폴더가 필요하지 않습니다. 또한 패키지를 직접 관리 할 필요도 없습니다.

인터넷 연결이 필요하지 않습니다

개발 중에는 인터넷에 연결되어 있지 않은 것을 제외하고는 개발 과정이 다소 드물지만 (운송중인 경우 제외) 괜찮은 패키지 관리자는 응용 프로그램을 빌드하기 위해 최신 버전이 필요하지 않습니다. 불평 할 수는 있지만 이미 설치된 버전으로 빌드하지 않아도됩니다.

빠른 빌드 (패키지 확인 안 함)

그것은 꽤 작은 스피드 부스트이지만, 당신은 그것을 지적 할 수 있습니다.

더 간단한 환경 (지식이 필요하지 않음)

요즘 대부분의 패키지 관리자는 매우 단순하므로 이러한 작업을 수행하여 해결할 수는 없습니다. 원한다면 비주얼 클라이언트도 있습니다. 그들은 실제로 진행되고있는 많은 로프트를 숨 깁니다.

패키지 관리자를 사용하면 다른 프로젝트간에 이러한 패키지를 공유 할 수도 있습니다. 내 프로젝트 중 5 개가 동일한 버전의 Boost를 사용하는 경우 각 프로젝트마다이를 복제 할 필요가 없습니다. 이것은 복잡한 종속성 트리에 대해 특히 그렇습니다.

lib 폴더를 사용하면 해당 프로젝트에 대해서만 패키지를 관리하는 반면 패키지 관리자를 사용하면 단일 도구로 전체 개발 환경에서이 작업을 수행 할 수 있습니다.


빌드 에이전트가 빌드 중에 패키지 관리자를 설치하고 종속성 등을 복원하도록 구성하는 것은 쉽지 않습니다. lib 폴더에는 필요하지 않습니다.
Ignacio Soler Garcia

4
나는 그것이 당신이 사용하는 언어에 달려 있다고 생각합니다. Ruby 또는 Rust와 같은 언어를 사용하면 패키지 관리가 매우 통합되어있어 완전히 사용하기가 쉽지 않습니다.
Sean Burton

글쎄, 나는 더 넓은 의견을 갖는 것을 의도적으로 생략했지만 NuGet, C # 및 VSTS 클라우드에 대해 구체적으로 이야기하고 있습니다.
Ignacio Soler Garcia

4
@Ignacio 어떤 빌드 시스템을 사용하든 NuGets를 복원하는 것이 결코 사소한 것은 아닙니다. 운 좋게 VSTS는 이것을 쉽게 얻을 수 있습니다 ( documentation ) : 솔루션 파일을 가리키고 NuGet 소스가 무엇을 사용하는지 알려주는 NuGet 복원 작업이 있습니다-간단한 프로젝트를 사용 nuget.org하면 간단하게 사용할 수 있습니다 (기본 템플릿은 이미 이런 식으로 설정되어 있습니다).
Voo

3
@Ben RVM은 패키지 관리자가 아닙니다. Ruby의 패키지 관리자는 RubyGems입니다. RVM은 Ruby 자체의 버전을 관리하며, rbenv가 더 좋습니다.
Sean Burton

5

그것은 단지 사이의 차이 사용하여 라이브러리 (lib 디렉토리) , 및 유지를 사용하여 메타 정보 (패키지 관리자) . 이러한 메타 정보는 버전 번호, (전이) 라이브러리 간의 의존성에 관한 것입니다.

DLL 지옥, 라이브러리 호환성, 자바 모듈 시스템, OSGi 등에 대한 논의는 최소한 어떤 형태의 의존성 관리를 가질만한 가치가 있다고 확신해야합니다.

  • 라이브러리 버전 및 종속성 문제는 시간이 많이 걸릴 수 있습니다.

또한 공유 (로컬) 리포지토리의 이점이 있으므로 여러 프로젝트에서 가져온 라이브러리의 복사본을 유지 관리 할 필요가 없습니다. 하나의 하위 모듈이 20 개인 프로젝트가있는 경우 해당 모듈 중 일부는 40 개의 이상한 종속성을 갖습니다.

  • 더 구조
  • 라이브러리 다듬기
  • 도서관에 대한 임시 인간 결정이 없음

3

예를 들어 쓸모없는 라이브러리 (더 이상 유지 / 사용할 수없는 버전), 로컬로 수정 된 라이브러리 버전 등을 처리 할 때 lib 폴더가 필요할 수 있습니다.

그러나 다른 모든 경우에는 패키지 관리자의 역할을 가정하는 개발자와 같습니다.

  • 개발자는 라이브러리를 다운로드해야합니다 (인터넷 필요)
  • 개발자는 수동으로 최신 릴리스를 확인해야합니다
  • ...

그리고 IMHO는 외부 도구의 사용법에 대해 알아야하지만 라이브러리 (예 : 종속성)에 대해서는 알아야하기 때문에 지식이 덜 필요합니다.


4
오래되었거나 수정 된 라이브러리의 경우에도 지금까지 본 모든 패키지 관리자는 로컬 종속성을 로컬 리포지토리에 업로드하는 옵션을 제공합니다. 그러나 "여기서 자동으로 작동"하는 경험을 잃어 버리는 곳도 있습니다.
Hulk

@Hulk 오픈 소스 라이브러리라면 버전을 게시하여 패키지 관리자에게 공개 할 수 있습니다. 관리자에게 수정 사항을 적용하거나 자신 만의 라이브러리 포크를 가져 와서 수정하십시오.
leftaroundabout

관리자가 패치 메일에 응답하지 않는 라이브러리를 수정 한 경우 라이브러리에 의존하는 다른 패키지도 수정 된 라이브러리에 만족할 수 있도록 패키지 관리자를 구성하는 방법을 알아내는 것이 문제가됩니다.
Damian Yerrick 2016 년

1

다른 질문으로는 다루지 않는 또 다른 문제가 있습니다.

동일한 라이브러리를 만드는 두 개의 패키지가 있다고 가정 해 봅시다 . 가장 좋은 경우에는 충돌이 없지만 동일한 HDD / SSD 공간이 두 번 사용 된 것입니다. 최악의 경우 버전과 같은 모호한 충돌이 발생합니다.

패키지 관리자를 사용하는 경우 라이브러리는 한 번만 (버전 당) 라이브러리를 설치하고 이미 경로를 제공합니다.

추신 : 물론이 프로를 이용하려면 동적 연결 (또는 귀하의 언어로 유사한 기능)이 필요합니다.


-5

공유 라이브러리가 90 년대 유닉스와 Windows 시스템에서 진보 된 항목으로 간주 된 한 가지 주요 이유는 동일한 라이브러리 세트를 사용하는 여러 프로그램을로드 할 때 RAM 사용량을 줄이는 방법이었습니다. 코드 공간은 정확한 라이브러리 및 해당 라이브러리의 버전 마다 한 번만 할당 하면되며 나머지 인스턴스 별 메모리 사용량은 정적 변수입니다.

많은 운영 체제는 unix mmap () api와 같은 메커니즘에 의존하는 방식으로 공유 라이브러리를 구현합니다. 이는 라이브러리가 정확히 동일한 버전 일뿐만 아니라 실제로는 동일한 FILE 일 필요가 있음을 의미합니다. 자체 라이브러리 세트를 제공하는 프로그램을 최대한 활용하는 것은 불가능합니다.

메모리가 훨씬 저렴하고 90 년대보다 라이브러리 버전이 더 다양해야한다는 점을 감안할 때 오늘날이 주장은 그다지 중요하지 않습니다.


4
이 질문은 공유 라이브러리에 대한 것이 아니라 라이브러리 폴더에 대한 의존성입니다.
Ignacio Soler Garcia

1
이것은 OP의 질문에 대답하지 않습니다
esoterik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.