Używanie zakresów Npm w usłudze Azure Artifacts
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
Zakresy npm służą jako środek do kategoryzowania powiązanych pakietów w grupach. Te zakresy umożliwiają tworzenie pakietów o identycznych nazwach dla tych utworzonych przez różnych użytkowników bez napotykania konfliktów. Korzystając z zakresów, można segregować pakiety publiczne i prywatne przez dodanie prefiksu zakresu @scopeName i skonfigurowanie pliku npmrc w celu wyłącznego używania kanału informacyjnego z tym określonym zakresem.
Usługa Azure Artifacts zapewnia możliwość publikowania i pobierania pakietów o określonym zakresie i niezakresowych z kanałów informacyjnych lub publicznych rejestrów. Zakresy npm są szczególnie przydatne podczas pracy z własnymi serwerami lokalnymi, które nie mają dostępu do Internetu, ponieważ konfigurowanie nadrzędnych źródeł w takich scenariuszach nie jest możliwe. Podsumowując, w przypadku korzystania z zakresów:
- Nie musimy martwić się o kolizje nazw.
- Nie trzeba zmieniać rejestru npm, aby zainstalować lub opublikować nasze pakiety.
- Każda organizacja/użytkownik npm ma własny zakres, a tylko właściciel lub członkowie zakresu mogą publikować pakiety w ich zakresie.
Ustawienia projektu
Zaloguj się do organizacji usługi Azure DevOps, a następnie przejdź do projektu.
Wybierz pozycję Artefakty, a następnie wybierz pozycję Połączenie do kanału informacyjnego.
Wybierz pozycję npm, a następnie wybierz pozycję Inne.
.npmrc
Dodaj plik w tym samym katalogu co package.json i wklej następujący fragment kodu do pliku.Kanał informacyjny o zakresie organizacji:
registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
Źródło danych o zakresie projektu:
registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
Konfigurowanie poświadczeń
Skopiuj następujący fragment kodu do pliku na poziomie
.npmrc
użytkownika (na przykład: C:\Users\FabrikamUser.npmrc). Upewnij się, że nie wklejasz go do pliku npmrc w repozytorium źródłowym.Kanał informacyjny o zakresie organizacji:
; begin auth token //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:username=[ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value ; end auth token
Źródło danych o zakresie projektu:
; begin auth token //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value ; end auth token
Wygeneruj osobisty token dostępu przy użyciu zakresów odczytu i zapisu pakietów>.
Uruchom następujące polecenie, aby zakodować nowo wygenerowany osobisty token dostępu. Po wyświetleniu monitu wklej osobisty token dostępu, a następnie skopiuj wynikową wartość zakodowaną w formacie Base64.
node -e "require('readline') .createInterface({input:process.stdin,output:process.stdout,historySize:0}) .question('PAT> ',p => { b64=Buffer.from(p.trim()).toString('base64');console.log(b64);process.exit(); })"
.npmrc
Otwórz plik i zastąp symbol zastępczy[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
zakodowanym osobistym tokenem dostępu, który właśnie został utworzony.
Konfiguracja zakresu
W pliku npmrc zastąp ciąg registry=<YOUR_SOURCE_URL>
ciągiem @ScopeName:registry=<YOUR_SOURCE_URL>
.
Pamiętaj, aby uwzględnić zarówno nazwy zakresu, jak i pakietów w pliku package.json w następujący sposób: { "name": "@ScopeName/PackageName" }
. Zapoznaj się z poniższymi przykładami:
Kanał informacyjny o zakresie organizacji:
@ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
{ "name": "@ScopeName/PackageName" }
Źródło danych o zakresie projektu:
@ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
{ "name": "@ScopeName/PackageName" }
Przykład:
@local:registry=https://pkgs.dev.azure.com/FabrikamOrg/NpmDemo/_packaging/FabrikamFeed/npm/registry/ always-auth=true
{ "name": "@demo/js-e2e-express-server", "version": "2.0.0", "description": "JavaScript server written with Express.js", "main": "index.js", "directories": { "doc": "docs", "test": "test" }
Publikowanie pakietów o określonym zakresie
Otwórz okno wiersza polecenia, przejdź do katalogu projektu i uruchom następujące polecenie, aby opublikować pakiet o określonym zakresie. W naszym przykładzie nasz pakiet jest wyświetlany w @local widoku.
npm publish
Nadrzędne źródła a zakresy
Źródła nadrzędne zapewniają największą elastyczność korzystania z kombinacji pakietów o określonym zakresie i niezakresowych w kanale informacyjnym, a także pakietów o określonym zakresie i niezakresowych z publicznych rejestrów, takich jak npmjs.com.
Zakresy nakładają jednak ograniczenie nazewnictwa pakietów: każda nazwa pakietu musi zaczynać się od @<scope>
. Jeśli chcesz opublikować pakiety prywatne w publicznych rejestrach, musisz to zrobić z zakresami nienaruszonymi. Jeśli usuniesz zakresy pakietów podczas wdrażania pakietów, musisz zaktualizować wszystkie odwołania w pliku package.json . Mając to na uwadze, zakresy mogą służyć jako realna alternatywa dla nadrzędnych źródeł.