개요
PowerShell Gallery는 커뮤니티와 Microsoft가 게시한 모듈·스크립트를 모아 둔 공개 저장소이고, Find-Module/Install-Module은 74–75장에서 다룬 “직접 만든 모듈"이 아니라 “남이 만들어 배포한 모듈"을 가져오는 통로다. PowerShellGet 모듈(PowerShell 5.0+ 기본 포함)이 이 cmdlet들을 제공하며, PowerShell 7.4부터는 더 새로운 Microsoft.PowerShell.PSResourceGet이 권장 대안으로 함께 제공된다.
정신 모델은 “Find-Module은 카탈로그를 검색하는 것이고, Install-Module은 실제로 다운로드해 로컬 디스크에 설치하는 것"이라는 것이다. 75장의 Import-Module과 마찬가지로, 설치는 세션에 자동으로 로드되는 것과는 별개의 단계다.
사용법
| |
종류
| cmdlet | 역할 |
|---|---|
Find-Module | 저장소에서 모듈 검색(설치는 안 함) |
Install-Module | 검색된 모듈을 로컬에 다운로드·설치 |
Update-Module | 이미 설치된 모듈을 최신 버전으로 갱신 |
Uninstall-Module | 설치된 모듈을 디스크에서 완전히 제거(75장의 Remove-Module과 달리 영구적) |
-Scope CurrentUser | 현재 사용자 전용 경로에 설치(관리자 권한 불필요) |
-Scope AllUsers | 모든 사용자가 쓸 수 있는 경로에 설치(관리자 권한 필요) |
예시
| |
주의사항·함정
설치된 모듈은 보안을 위해 자동으로 임포트되지 않는다: Install-Module로 모듈을 설치해도 세션에 바로 사용할 수 있게 되는 것은 아니다 — 악성 코드가 포함된 모듈을 설치 즉시 실행하는 사고를 막기 위한 의도적인 설계다. 처음 사용하는 모듈이라면 코드를 먼저 검토한 뒤, 75장에서 배운 Import-Module이나 명령을 처음 호출할 때의 자동 로딩으로 실제로 세션에 들여와야 한다.
-Scope를 생략하면 PowerShell 버전과 실행 권한에 따라 기본값이 달라진다: PowerShellGet 1.x는 기본이 AllUsers(관리자 권한 필요)지만, PowerShellGet 2.0 이상에서 일반 세션으로 실행하면 기본이 CurrentUser(권한 불필요)로 바뀐다. 관리자 권한으로 실행 중인 세션에서는 다시 AllUsers가 기본이 된다 — 스크립트를 여러 환경에 배포한다면 -Scope를 명시적으로 지정해 이 버전별 기본값 차이에 흔들리지 않게 하는 편이 안전하다.
같은 이름의 명령을 제공하는 모듈이 이미 있으면 경고가 뜨고 설치가 중단될 수 있다: 기존 모듈과 이름·명령이 충돌하면 Install-Module이 경고를 표시하며 확인을 요구한다. 의도적으로 덮어쓰려면 -Force와 -AllowClobber를 함께 써야 하지만, 이는 기존에 의존하던 다른 스크립트를 깨뜨릴 수 있으므로 신중하게 판단해야 한다.
TLS 1.2 미만 설정에서는 PowerShell Gallery 접근 자체가 실패한다: 오래된 Windows PowerShell 5.1 환경이라면 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12를 먼저 실행해야 갤러리 연결이 되는 경우가 있다 — PowerShell Gallery가 오래된 TLS 버전 지원을 중단했기 때문이다.
이식성: PowerShell Gallery는 Python의 PyPI(pip install), Node.js의 npm(npm install)에 정확히 대응하는 개념이다. Bash·CMD 생태계에는 언어 자체에 내장된 패키지 관리자가 없어 각 배포판의 시스템 패키지 관리자(apt, winget 등, 10부에서 다룰 예정)에 의존해야 한다는 점이 다르다.
![Featured image of post [PowerShell] 76. PowerShell Gallery — Install-Module/Find-Module](/post/powershell/powershell-gallery-install-find-module-powershell/wordcloud_hu_5b196ac0b5a2f054.webp)
![[PowerShell] 74. 모듈 개념과 구조(.psm1/.psd1)](/post/powershell/module-structure-psm1-psd1-powershell/wordcloud_hu_7fca0b454a750e2a.webp)
![[PowerShell] 75. Import-Module/Get-Module/Remove-Module](/post/powershell/import-get-remove-module-powershell/wordcloud_hu_f7c6ed2cf0491565.webp)
![[PowerShell] 76. PowerShell Gallery — Install-Module/Find-Module](/post/powershell/powershell-gallery-install-find-module-powershell/wordcloud_hu_68568dc7c4947f25.webp)
![[PowerShell] 77. PowerShell 클래스(class 키워드)](/post/powershell/powershell-class-keyword-powershell/wordcloud_hu_5ff5e6ec1d4f4d49.webp)
![[PowerShell] 78. Start-Job/Get-Job/Receive-Job — 백그라운드 작업](/post/powershell/start-job-get-job-receive-job-powershell/wordcloud_hu_f975cbd44945c564.webp)
![[PowerShell] 79. ForEach-Object -Parallel(PowerShell 7+)](/post/powershell/foreach-object-parallel-threadjob-powershell/wordcloud_hu_30c9034b5b05c027.webp)