Özel işlem hatları görev uzantısı eklemeAdd a custom pipelines task extension

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018-TFS 2017Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 - TFS 2017

Azure DevOps 'da özel derleme veya sürüm görevleri için kuruluşunuza uzantıları yüklemeyi öğrenin.Learn how to install extensions to your organization for custom build or release tasks in Azure DevOps. Bu görevler, adım ekleme sihirbazında Microsoft tarafından belirtilen görevlerin yanında görüntülenir.These tasks appear next to Microsoft-provided tasks in the Add Step wizard.

Azure DevOps 'daki uzantılar için derleme görevi kataloğunun ekran görüntüsü.

Yeni platformlar arası derleme/sürüm sistemi hakkında daha fazla bilgi edinmek için bkz. Azure Pipelines nedir?.To learn more about the new cross-platform build/release system, see What is Azure Pipelines?.

Not

Bu makalede aracı tabanlı Uzantılarda aracı görevleri ele alınmaktadır.This article covers agent tasks in agent-based extensions. Sunucu görevleri/sunucu tabanlı uzantılar hakkında daha fazla bilgi için sunucu görevi GitHub belgelerinegöz atın.For information on server tasks/server-based extensions, check out the Server Task GitHub Documentation.

ÖnkoşullarPrerequisites

Azure DevOps uzantıları oluşturmak için aşağıdaki yazılım ve araçlara ihtiyacınız vardır:To create extensions for Azure DevOps, you need the following software and tools:

  • Azure DevOps 'da bir kuruluş.An organization in Azure DevOps. Daha fazla bilgi için bkz. kuruluş oluşturma.For more information, see Create an organization.

  • Bir metin düzenleyici.A text editor. Birçok öğreticilerde IntelliSense ve hata ayıklama desteği sağlayan Visual Studio Code kullanırız.For many of the tutorials, we use Visual Studio Code, which provides intellisense and debugging support. En son sürümü indirmek için Code.VisualStudio.com adresine gidin.Go to code.visualstudio.com to download the latest version.

  • Node.js en son sürümü .The latest version of Node.js. Üretim ortamı yalnızca Node10 veya Node6 kullanır ( "Node" "execution" yerine nesnesini kullanarak Node10 ).The production environment uses only Node10 or Node6 (by using the "Node" in the "execution" object instead of Node10).

  • Node10 kullanan görevler için sürüm 4.0.2 veya daha yeni bir sürüm önerdiğimiz halde TypeScript derleyicisi 2.2.0 veya üzeri.TypeScript Compiler 2.2.0 or greater, although we recommend version 4.0.2 or newer for tasks that use Node10. Derleyiciyi indirmek için npmjs.com adresine gidin.Go to npmjs.com to download the compiler.

  • Uzantılarınızı paketleyip Azure DevOps Için platformlar arası CLI .Cross-platform CLI for Azure DevOps to package your extensions. Bir Node.js bileşeni kullanarak TFX-CLI 'yi npm çalıştırarak yükleyebilirsiniz npm i -g tfx-cli .You can install tfx-cli by using npm, a component of Node.js, by running npm i -g tfx-cli.

  • homeProjeniz için bir dizin.A home directory for your project. homeBu öğreticideki adımları tamamladıktan sonra, derleme veya yayın görev uzantısının dizini aşağıdaki örnekteki gibi görünmelidir:The home directory of a build or release task extension should look like the following example after you complete the steps in this tutorial:

    |--- README.md    
    |--- images                        
        |--- extension-icon.png  
    |--- buildAndReleaseTask            // where your task scripts are placed
    |--- vss-extension.json             // extension's manifest
    
  • VSS-Web-Extension-SDK paketi yüklemesi.The vss-web-extension-sdk package installation.

Önemli

Geliştirme makinesinin, yazılan kodun aracıdaki üretim ortamıyla ve Azure-işlem hatları-Task-lib ' ın en son önizleme sürümü ile uyumlu olduğundan emin olmak için Node v 10.21.0 ' yi çalıştırması gerekir.The dev machine needs to run Node v10.21.0 to ensure that the code written is compatible with the production environment on the agent and the latest non-preview version of azure-pipelines-task-lib.

UNIX ile Windows arasında geliştirmeDevelop in Unix vs. Windows

Bu, PowerShell ile Windows 'da dolaştık.We did this walk-through on Windows with PowerShell. Tüm platformlar için genel hale getirmeye çalıştık, ancak ortam değişkenlerini alma söz dizimi farklı.We attempted to make it generic for all platforms, but the syntax for getting environment variables is different.

Mac veya Linux kullanıyorsanız, tüm örneklerini $env:<var>=<val> ile değiştirin export <var>=<val> .If you're using a Mac or Linux, replace any instances of $env:<var>=<val> with export <var>=<val>.

1. Adım: özel bir görev oluşturmaStep 1: Create a custom task

Görevinizi ayarlayın.Set up your task. Klasör içinde 1. adım 'un her bölümünü yapın buildAndReleaseTask .Do every part of Step 1 within the buildAndReleaseTask folder.

Görev yapı iskelesi oluşturCreate task scaffolding

Görevin klasör yapısını oluşturun ve gerekli kitaplıkları ve bağımlılıkları yükler.Create the folder structure for the task and install the required libraries and dependencies.

Dosya üzerinde bir dizin ve package.jsoluşturmaCreate a directory and package.json file

buildAndReleaseTaskKlasörünüzün içinden aşağıdaki komutu çalıştırın:From within your buildAndReleaseTask folder, run the following command:

npm init

npm init dosyayı oluşturur package.json .npm init creates the package.json file. Varsayılan tüm seçenekleri kabul edebilirsiniz npm init .You can accept all of the default npm init options.

İpucu

Görev klasörünüzün düğüm modüllerini içermesini beklediği için, aracı gerekli modülleri otomatik olarak yüklemez.The agent doesn't automatically install the required modules because it's expecting your task folder to include the node modules. Bunu azaltmak için öğesini öğesine kopyalayın node_modules buildAndReleaseTask .To mitigate this, copy the node_modules to buildAndReleaseTask. Göreviniz büyüdükçe, bir VSıX dosyasının boyut sınırını (50MB) aşmayı çok daha kolay hale gelir.As your task gets bigger, it's easy to exceed the size limit (50MB) of a VSIX file. Düğüm klasörünü kopyalamamadan önce, veya çalıştırmak isteyebilirsiniz ya da npm install --production npm prune --production her şeyi derlemek ve paketleyebilir bir betik yazabilirsiniz.Before you copy the node folder, you may want to run npm install --production or npm prune --production, or you can write a script to build and pack everything.

Azure-işlem hatları ekleme-görev-libAdd azure-pipelines-task-lib

Görev oluşturmak için kullanılması gereken bir Azure-işlem hattı-Task-lib kitaplığı sağlıyoruz.We provide a library, azure-pipelines-task-lib, that should be used to create tasks. Kitaplığınıza ekleyin.Add it to your library.

npm install azure-pipelines-task-lib --save

Dış bağımlılıklar için türler eklemeAdd typings for external dependencies

Dış bağımlılıklar için TypeScript yazımlarını 'nin yüklendiğinden emin olun.Ensure that TypeScript typings are installed for external dependencies.

npm install @types/node --save-dev
npm install @types/q --save-dev

Bir .gitignore dosya oluşturun ve bu dosyaya node_modules ekleyin.Create a .gitignore file and add node_modules to it. Yapı işleminiz, npm install typings install her seferinde node_modules oluşturulması ve iade alınması gerekmeyen bir ve bir gerektirir.Your build process should do an npm install and a typings install so that node_modules are built each time and don't need to be checked in.

echo node_modules > .gitignore

TypeScript sürümü seçinChoose typescript version

Görevler, 2.3.4 veya 4.0.2 TypeScript sürümlerini kullanabilir.Tasks can use typescript versions 2.3.4 or 4.0.2. Seçilen TypeScript sürümünü şu komutu kullanarak yükleyebilirsiniz:You can install the chosen typescript version using this command:

npm install typescript@4.0.2 --save-dev

Bu adımı atlarsanız, TypeScript sürüm 2.3.4 varsayılan olarak kullanılır.If you skip this step, typescript version 2.3.4 gets used by default.

Derleyici seçenekleri üzerinde tsconfig.jsoluşturmaCreate tsconfig.json compiler options

Bu dosya, TypeScript dosyalarınızın JavaScript dosyalarına derlendiğinden emin olmanızı sağlar.This file ensures that your TypeScript files are compiled to JavaScript files.

tsc --init

Örneğin, ES5 yerine ES6 standardına derlemek istiyoruz.For example, we want to compile to the ES6 standard instead of ES5. ES6 standardının yapıldığından emin olmak için, yeni oluşturulan ' i açın tsconfig.json ve target alanı "ES6" olarak güncelleştirin.To ensure the ES6 standard happens, open the newly generated tsconfig.json and update the target field to "es6."

Not

Komutun başarıyla çalışmasını sağlamak için, TypeScript 'in yerel makinenizde NPM ile küresel olarak yüklendiğinden emin olun.To have the command run successfully, make sure that TypeScript is installed globally with npm on your local machine.

Görev uygulamaTask implementation

Artık yapı iskelesi tamamlanana kadar özel görevimizi oluşturmuz.Now that the scaffolding is complete, we can create our custom task.

Üzerinde task.jstask.json

Ardından, task.json buildAndReleaseTask klasöründe bir dosya oluşturacağız.Next, we create a task.json file in the buildAndReleaseTask folder. task.jsonDosya derleme veya yayın görevini açıklar ve derleme/yayınlama sisteminin kullanıcıya yapılandırma seçeneklerini işlemek ve derleme/yayınlama sırasında hangi betiklerin yürütüleceğini bilmesi için kullandığı şeydir.The task.json file describes the build or release task and is what the build/release system uses to render configuration options to the user and to know which scripts to execute at build/release time.

Aşağıdaki kodu kopyalayın ve {{placeholders}} görevin bilgileriyle değiştirin.Copy the following code and replace the {{placeholders}} with your task's information. En önemli yer tutucu, taskguid ve benzersiz olmalıdır.The most important placeholder is the taskguid, and it must be unique. taskguid Microsoft 'un çevrimiçi Guidgen aracınıkullanarak oluşturabilirsiniz.You can generate the taskguid by using Microsoft's online GuidGen tool.

{
    "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json",
    "id": "{{taskguid}}",
    "name": "{{taskname}}",
    "friendlyName": "{{taskfriendlyname}}",
    "description": "{{taskdescription}}",
    "helpMarkDown": "",
    "category": "Utility",
    "author": "{{taskauthor}}",
    "version": {
        "Major": 0,
        "Minor": 1,
        "Patch": 0
    },
    "instanceNameFormat": "Echo $(samplestring)",
    "inputs": [
        {
            "name": "samplestring",
            "type": "string",
            "label": "Sample String",
            "defaultValue": "",
            "required": true,
            "helpMarkDown": "A sample string"
        }
    ],
    "execution": {
        "Node10": {
            "target": "index.js"
        }
    }
}

Bileşenlerdetask.jstask.json components
Aşağıda, dosyanın bazı bileşenlerinin açıklamaları verilmiştir task.json :Following are descriptions of some of the components of the task.json file:

ÖzellikProperty AçıklamaDescription
id Göreviniz için benzersiz bir GUID.A unique GUID for your task.
name Boşluk içermeyen ad.Name with no spaces.
friendlyName Açıklayıcı ad (boşluklara izin verilir).Descriptive name (spaces allowed).
description Göreviniz için ne işe yönelik ayrıntılı açıklama.Detailed description of what your task does.
author Derleme veya yayın görevinin geliştirilmesi için varlığı açıklayan kısa dize, örneğin: "Microsoft Corporation."Short string describing the entity developing the build or release task, for example: "Microsoft Corporation."
instanceNameFormat Görev, derleme veya sürüm adımı listesi içinde nasıl görüntülenir.How the task is displayed within the build or release step list. $ (VariableName) kullanarak değişken değerlerini kullanabilirsiniz.You can use variable values by using $(variablename).
groups Görev özelliklerinin Kullanıcı arabiriminde mantıksal olarak gruplandırılabilen grupları açıklar.Describes groups that task properties may be logically grouped by in the UI.
inputs Derleme veya sürüm Göreviniz çalıştırıldığında kullanılacak girişler.Inputs to be used when your build or release task runs. Bu görev, sampleString adında bir girdi bekliyor.This task expects an input with the name samplestring.
execution Bu görev için betikler de dahil olmak üzere yürütme seçenekleri.Execution options for this task, including scripts.

Not

Daha ayrıntılı bir şekilde dosya task.jsbakmak veya uzantınızın birden çok sürümünü nasıl paketleyeceğinizi öğrenmek için, derleme/Yayın görev başvurusunu inceleyin.For a more in-depth look into the task.json file, or to learn how to bundle multiple versions in your extension, check out the build/release task reference.

Dizin. TSindex.ts

index.tsAşağıdaki kodu başvuru olarak kullanarak bir dosya oluşturun.Create an index.ts file by using the following code as a reference. Bu kod, görev çağrıldığında çalışır.This code runs when the task is called.

import tl = require('azure-pipelines-task-lib/task');

async function run() {
    try {
        const inputString: string | undefined = tl.getInput('samplestring', true);
        if (inputString == 'bad') {
            tl.setResult(tl.TaskResult.Failed, 'Bad input was given');
            return;
        }
        console.log('Hello', inputString);
    }
    catch (err) {
        tl.setResult(tl.TaskResult.Failed, err.message);
    }
}

run();

SeCompile

İçinden bir dosya derlemek için buildAndReleaseTask klasöründen "TSC" yazın index.js index.ts .Enter "tsc" from the buildAndReleaseTask folder to compile an index.js file from index.ts.

Görevi çalıştırmaRun the task

Bir aracı, PowerShell 'den ile görevi çalıştırabilir node index.js .An agent can run the task with node index.js from PowerShell.

Aşağıdaki örnekte, girişler sağlanmadığından ( samplestring gerekli bir giriştir) görev başarısız olur.In the following example, the task fails because inputs weren't supplied (samplestring is a required input).

node index.js
##vso[task.debug]agent.workFolder=undefined
##vso[task.debug]loading inputs and endpoints
##vso[task.debug]loaded 0
##vso[task.debug]task result: Failed
##vso[task.issue type=error;]Input required: samplestring
##vso[task.complete result=Failed;]Input required: samplestring

Bir çözüm olarak, girişi ayarlayabiliyoruz samplestring ve görevi yeniden çalıştırabiliriz.As a fix, we can set the samplestring input and run the task again.

$env:INPUT_SAMPLESTRING="Human"
node index.js
##vso[task.debug]agent.workFolder=undefined
##vso[task.debug]loading inputs and endpoints
##vso[task.debug]loading INPUT_SAMPLESTRING
##vso[task.debug]loaded 1
##vso[task.debug]Agent.ProxyUrl=undefined
##vso[task.debug]Agent.CAInfo=undefined
##vso[task.debug]Agent.ClientCert=undefined
##vso[task.debug]Agent.SkipCertValidation=undefined
##vso[task.debug]samplestring=Human
Hello Human

Bu kez görev, sağlandığı için başarılı oldu samplestring ve doğru şekilde "Merhaba insan" olarak alındı!This time, the task succeeded because samplestring was supplied, and it correctly outputted "Hello Human"!

2. Adım: görev betiklerinizi birim testiStep 2: Unit test your task scripts

Birim testi hedefi, çağıran dış araçların değil, görev betiğini hızlı bir şekilde test olmaktır.The goal of unit testing is to quickly test the task script, not the external tools it's calling. Hem başarı hem de hata yollarının tüm yönlerini test etmek istiyoruz.We want to test all aspects of both success and failure paths.

Test araçları 'nı yüklerInstall test tools

Bu kılavuzda, Mocha 'yi test sürücüsü olarak kullanıyoruz.We use Mocha as the test driver in this walk through.

npm install mocha --save-dev -g
npm install sync-request --save-dev
npm install @types/mocha --save-dev

Test paketi oluşturCreate test suite

testsAşağıdaki içeriğe sahip bir dosya içeren bir klasör oluşturun _suite.ts :Create a tests folder containing a _suite.ts file with the following contents:

import * as path from 'path';
import * as assert from 'assert';
import * as ttm from 'azure-pipelines-task-lib/mock-test';

describe('Sample task tests', function () {

    before( function() {

    });

    after(() => {

    });

    it('should succeed with simple inputs', function(done: Mocha.Done) {
        // Add success test here
    });

    it('it should fail if tool returns 1', function(done: Mocha.Done) {
        // Add failure test here
    });    
});

İpucu

Test klasörünüzün buildAndReleaseTask klasöründe bulunması gerekir.Your test folder should be located in the buildAndReleaseTask folder. Bir eşitleme-istek hatası alırsanız, komutuyla geçici olarak buildAndReleaseTask klasörüne eşitleme isteği ekleyerek bu sorunu çözebilirsiniz npm i --save-dev sync-request .If you get a sync-request error, you can work around it by adding sync-request to the buildAndReleaseTask folder with the command npm i --save-dev sync-request.

Başarı testi oluşturmaCreate success test

Başarı testi, araç uygun girdilere sahip olduğunda, hata veya uyarı olmadan başarılı olduğunu ve doğru çıktıyı döndürdüğünü doğrular.The success test validates that when the tool has the appropriate inputs, it succeeds with no errors or warnings and returns the correct output.

Görev sahte Çalıştırıcısını içeren bir dosya oluşturun.Create a file containing your task mock runner. Bu dosya oluşturma, görevi çalıştırmaya benzetir ve dış yöntemlerin tüm çağrılarını gizler.This file creation simulates running the task and mocks all calls to outside methods.

success.tsAşağıdaki içeriklerle test dizininizde bir dosya oluşturun:Create a success.ts file in your test directory with the following contents:

import ma = require('azure-pipelines-task-lib/mock-answer');
import tmrm = require('azure-pipelines-task-lib/mock-run');
import path = require('path');

let taskPath = path.join(__dirname, '..', 'index.js');
let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);

tmr.setInput('samplestring', 'human');

tmr.run();

Sonra, _suite.ts görev sahte Çalıştırıcısı 'nı çalıştırmak için dosyanıza aşağıdaki örnek başarı testini ekleyin:Next, add the following example success test to your _suite.ts file to run the task mock runner:

it('should succeed with simple inputs', function(done: Mocha.Done) {
    this.timeout(1000);

    let tp = path.join(__dirname, 'success.js');
    let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);

    tr.run();
    console.log(tr.succeeded);
    assert.equal(tr.succeeded, true, 'should have succeeded');
    assert.equal(tr.warningIssues.length, 0, "should have no warnings");
    assert.equal(tr.errorIssues.length, 0, "should have no errors");
    console.log(tr.stdout);
    assert.equal(tr.stdout.indexOf('Hello human') >= 0, true, "should display Hello human");
    done();
});

Hata testi oluşturCreate failure test

Hata testi, araç hatalı veya tamamlanmamış bir girişi aldığında, faydalı çıkışın beklenen şekilde başarısız olduğunu doğrular.The failure test validates that when the tool gets bad or incomplete input, it fails in the expected way with helpful output.

İlk olarak, görev sahte Çalıştırıcısı 'nı oluşturacağız.First, we create our task mock runner. Bunu yapmak için, failure.ts aşağıdaki içeriklerle test dizininizde bir dosya oluşturun:To do so, create a failure.ts file in your test directory with the following contents:

import ma = require('azure-pipelines-task-lib/mock-answer');
import tmrm = require('azure-pipelines-task-lib/mock-run');
import path = require('path');

let taskPath = path.join(__dirname, '..', 'index.js');
let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);

tmr.setInput('samplestring', 'bad');

tmr.run();

Sonra, _suite.ts görev sahte Çalıştırıcısı 'nı çalıştırmak için dosyanıza aşağıdakini ekleyin:Next, add the following to your _suite.ts file to run the task mock runner:

it('it should fail if tool returns 1', function(done: Mocha.Done) {
    this.timeout(1000);

    let tp = path.join(__dirname, 'failure.js');
    let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);

    tr.run();
    console.log(tr.succeeded);
    assert.equal(tr.succeeded, false, 'should have failed');
    assert.equal(tr.warningIssues.length, 0, "should have no warnings");
    assert.equal(tr.errorIssues.length, 1, "should have 1 error issue");
    assert.equal(tr.errorIssues[0], 'Bad input was given', 'error issue output');
    assert.equal(tr.stdout.indexOf('Hello bad'), -1, "Should not display Hello bad");

    done();
});

Testleri çalıştırmaRun the tests

Testleri çalıştırmak için aşağıdaki komutları çalıştırın:To run the tests, run the following commands:

tsc
mocha tests/_suite.js

Her iki testin geçmesi gerekir.Both tests should pass. Testleri daha ayrıntılı çıktıyla (derleme konsolunda gördükleriniz) çalıştırmak istiyorsanız, ortam değişkenini ayarlayın: TASK_TEST_TRACE=1 .If you want to run the tests with more verbose output (what you'd see in the build console), set the environment variable: TASK_TEST_TRACE=1.

$env:TASK_TEST_TRACE=1

3. Adım: Uzantı bildirim dosyası oluşturmaStep 3: Create the extension manifest file

Uzantı bildirimi, uzantınızın tüm bilgilerini içerir.The extension manifest contains all of the information about your extension. Görev klasörleriniz ve resimler klasörleriniz dahil olmak üzere dosyalarınıza bağlantılar içerir.It includes links to your files, including your task folders and images folders. extension-icon.png bir Resimler klasörü oluşturduğunuzdan emin olun.Ensure you've created an images folder with extension-icon.png. Aşağıdaki örnek, derleme veya yayın görevini içeren bir uzantı bildirimidir.The following example is an extension manifest that contains the build or release task.

Aşağıdaki. JSON kodunu kopyalayın ve vss-extension.json dizininize dosyanız olarak kaydedin home .Copy the following .json code and save it as your vss-extension.json file in your home directory. Bu dosyayı buildAndReleaseTask klasöründe oluşturmayın.Don't create this file in the buildAndReleaseTask folder.

{
    "manifestVersion": 1,
    "id": "build-release-task",
    "name": "Fabrikam Build and Release Tools",
    "version": "0.0.1",
    "publisher": "fabrikam",
    "targets": [
        {
            "id": "Microsoft.VisualStudio.Services"
        }
    ],
    "description": "Fabrikam ile derleme/serbest bırakma araçları. Bir derleme/yayın görevi içerir.",
    "categories": [
        "Azure Pipelines"
    ],
    "icons": {
        "default": "images/extension-icon.png"
    },
    "files": [
        {
            "path": "buildAndReleaseTask"
        }
    ],
    "contributions": [
        {
            "id": "custom-build-release-task",
            "type": "ms.vss-distributed-task.task",
            "targets": [
                "ms.vss-distributed-task.tasks"
            ],
            "properties": {
                "name": "buildAndReleaseTask"
            }
        }
    ]
}

Not

Yayımcının yayımcı adı olarak değiştirilmesi gerekir.The publisher here must be changed to your publisher name. Şimdi bir yayımcı oluşturmak istiyorsanız, yönergeler için yayımcıyı oluşturma bölümüne gidin.If you want to create a publisher now, go to create your publisher for instructions.

KatkılarContributions

ÖzellikProperty AçıklamaDescription
id Katkı tanımlayıcısı.Identifier of the contribution. Uzantı içinde benzersiz olmalıdır.Must be unique within the extension. Derleme veya yayın görevinin adıyla eşleşmesi gerekmez.Doesn't need to match the name of the build or release task. Genellikle derleme veya yayın görev adı, katkı KIMLIĞIDIR.Typically the build or release task name is in the ID of the contribution.
type Katkı türü.Type of the contribution. MS. VSS-dağıtılmış-Task. Task olmalıdır.Should be ms.vss-distributed-task.task.
targets Bu katkıdan "hedeflenmiş" katkıları.Contributions "targeted" by this contribution. MS. VSS-dağıtılmış-Task. Tasks olmalıdır.Should be ms.vss-distributed-task.tasks.
properties.name Görevin adı.Name of the task. Bu ad, karşılık gelen kendi kendine içerilen derleme veya yayın görevi ardışık düzeninin klasör adıyla eşleşmelidir.This name must match the folder name of the corresponding self-contained build or release task pipeline.

DosyalarFiles

ÖzellikProperty AçıklamaDescription
path Dizine göre dosya veya klasörün yolu home .Path of the file or folder relative to the home directory.

Not

Uzantı bildirim dosyası hakkında, özellikleri ve ne yaptıkları hakkında daha fazla bilgi için, Uzantı bildirim başvurusunuinceleyin.For more information about the extension manifest file, such as its properties and what they do, check out the extension manifest reference.

4. Adım: uzantınızı paketleyinStep 4: Package your extension

Uzantınızı yazdıktan sonra, Visual Studio Market bir sonraki adım, tüm dosyalarınızı birlikte paketlemenize olanak sağlar.After you've written your extension, the next step toward getting it into the Visual Studio Marketplace is to package all of your files together. Tüm uzantılar VSıX 2,0 ile uyumlu. vsix dosyaları olarak paketlenmiştir.All extensions are packaged as VSIX 2.0-compatible .vsix files. Microsoft, uzantınızı paketlemek için platformlar arası bir komut satırı arabirimi (CLı) sağlar.Microsoft provides a cross-platform command-line interface (CLI) to package your extension.

Uzantınızı bir. vsix dosyasına paketleyerek TFX-CLI' y i n, uzantınızın ana dizinine gidin ve aşağıdaki komutu çalıştırın:Packaging your extension into a .vsix file is effortless after you have the tfx-cli, go to your extension's home directory, and run the following command:

tfx extension create --manifest-globs vss-extension.json

Not

Bir uzantının veya tümleştirmenin sürümünün her güncelleştirmede artırılması gerekir.An extension or integration's version must be incremented on every update.
Mevcut bir uzantıyı güncelleştirirken, bildirimde sürümü güncelleştirin veya --rev-version komut satırı anahtarını geçirin.When you're updating an existing extension, either update the version in the manifest or pass the --rev-version command line switch. Bu, uzantınızın Düzeltme Eki sürüm numarasını artırır ve yeni sürümü bildiriminiz için kaydeder.This increments the patch version number of your extension and saves the new version to your manifest. Bir güncelleştirmenin gerçekleşmesi için hem görev sürümünü hem de uzantı sürümünü Rev yapmanız gerekir.You must rev both the task version and extension version for an update to occur. tfx extension create --manifest-globs vss-extension.json --rev-version Yalnızca uzantı sürümünü güncelleştirir, görev sürümünü değil.tfx extension create --manifest-globs vss-extension.json --rev-version only updates the extension version and not the task version. Daha fazla bilgi için bkz. GitHub 'Da derleme görevi.For more information, see Build Task in GitHub.

Paketlenmiş uzantınızı bir. vsix dosyasında aldıktan sonra, uzantınızı Market 'e yayımlamaya hazırsınız demektir.After you have your packaged extension in a .vsix file, you're ready to publish your extension to the Marketplace.

5. Adım: uzantınızı yayımlamaStep 5: Publish your extension

Yayımcısını oluşturmaCreate your publisher

Microsoft 'un uzantıları da dahil olmak üzere tüm uzantılar, bir yayımcı tarafından sağlanmakta olduğu şekilde tanımlanır.All extensions, including extensions from Microsoft, are identified as being provided by a publisher. Zaten var olan bir yayımcının üyesi değilseniz, bir tane oluşturacaksınız.If you aren't already a member of an existing publisher, you'll create one.

  1. Visual Studio Market Yayımlama portalındaoturum açın.Sign in to the Visual Studio Marketplace Publishing Portal.
  2. Zaten mevcut bir yayımcının üyesi değilseniz, bir yayımcı oluşturmanız istenir.If you aren't already a member of an existing publisher, you're prompted to create a publisher. Bir yayımcı oluşturmanız istenmez, sayfanın en altına gidin ve uzantıları Ilgili siteler altında Yayımla ' yı seçin.If you're not prompted to create a publisher, scroll down to the bottom of the page and select Publish extensions under Related Sites.
    • Yayımcı için bir tanımlayıcı belirtin, örneğin: mycompany-myteam .Specify an identifier for your publisher, for example: mycompany-myteam.
      • Bu tanımlayıcı, publisher uzantılarınızın bildirim dosyanızdaki özniteliği için değer olarak kullanılır.This identifier is used as the value for the publisher attribute in your extensions' manifest file.
    • Yayımcı için bir görünen ad belirtin, örneğin: My Team .Specify a display name for your publisher, for example: My Team.
  3. Market Yayımcı Sözleşmesi ' ni gözden geçirin ve Oluştur' u seçin.Review the Marketplace Publisher Agreement and select Create.

Yayımcı tanımlı.Your publisher is defined. Gelecekteki bir sürümde, yayımcının uzantılarını görüntüleme ve yönetme izinleri verebilirsiniz.In a future release, you can grant permissions to view and manage your publisher's extensions. Kullanıcılar arasında bir kimlik bilgileri kümesi paylaşma gereksinimi olmadan, uzantıları ortak bir yayımcı altında yayımlamak daha kolay ve daha güvenlidir.It's easier and more secure to publish extensions under a common publisher, without the need to share a set of credentials across users.

Uzantınızı karşıya yükleyinUpload your extension

Bir yayımcı oluşturduktan sonra, uzantınızı Market 'e yükleyebilirsiniz.After creating a publisher, you can upload your extension to the Marketplace.

  • Yeni uzantıyı karşıya yükle düğmesini bulun, paketlenmiş. vsix dosyanıza gidin ve karşıya yükle' yi seçin.Find the Upload new extension button, go to your packaged .vsix file, and select Upload.

Ayrıca, uzantınızı tfx extension publish tfx extension create tek bir adımda paketlemek ve yayımlamak için yerine komutunu kullanarak uzantınızı komut satırı aracılığıyla da yükleyebilirsiniz.You can also upload your extension via the command line by using the tfx extension publish command instead of tfx extension create to package and publish your extension in one step. İsterseniz, --share-with uzantınızı yayımlamadan sonra bir veya daha fazla hesapla paylaşmak için kullanabilirsiniz.You can optionally use --share-with to share your extension with one or more accounts after publishing. Bir kişisel erişim belirtecine de ihtiyacınız olacak.You'll need a personal access token, too. Daha fazla bilgi için bkz. kişisel erişim belirteci alma.For more information, see Acquire a personal access token.

tfx extension publish --manifest-globs your-manifest.json --share-with yourOrganization

Uzantınızı paylaşmaShare your extension

Uzantınızı karşıya yüklediğinize göre, bu, Market 'te yer aldığı ancak kimse onu göremez.Now that you've uploaded your extension, it's in the Marketplace, but no one can see it. Uygulamanızı yükleyip test edebilmeniz için kuruluşunuzla paylaşabilirsiniz.Share it with your organization so that you can install and test it.

  • Uzantınıza sağ tıklayın ve paylaşma' yı seçin ve kuruluşunuzun bilgilerini girin.Right-click your extension and select Share, and enter your organization information. Uzantınıza erişimi olmasını istediğiniz diğer hesaplarla paylaşabilirsiniz.You can share it with other accounts that you want to have access to your extension, too.

Önemli

Uzantıların genel olarak paylaşılması için yayımcılar doğrulanmalıdır.Publishers must be verified to share extensions publicly. Daha fazla bilgi için bkz. Package/Publish/Install.To learn more, see Package/Publish/Install.

Uzantınızın Market 'te olduğuna ve paylaşıldığına göre, onu kullanmak isteyen herkesin yüklemesi gerekir.Now that your extension is in the Marketplace and shared, anyone who wants to use it must install it.

6. Adım: uzantıyı Market 'e yayımlamak için derleme ve yayın işlem hattı oluşturmaStep 6: Create a build and release pipeline to publish the extension to Marketplace

Market 'teki özel görevi sürdürmek için Azure DevOps üzerinde bir derleme ve yayın işlem hattı oluşturun.Create a build and release pipeline on Azure DevOps to help maintain the custom task on the Marketplace.

ÖnkoşullarPrerequisites

İşlem hattı tarafından kullanılan değişkenleri barındıracak bir işlem hattı kitaplığı değişken grubu oluşturun.Create a pipeline library variable group to hold the variables used by the pipeline. Değişken grubu oluşturma hakkında daha fazla bilgi için bkz. değişken grupları ekleme ve kullanma.For more information about creating a variable group, see Add and use variable groups. Azure DevOps kitaplığı sekmesinden veya CLı aracılığıyla değişken grupları yapabileceğinizi aklınızda bulundurun.Keep in mind that you can make variable groups from the Azure DevOps Library tab or through the CLI. Bir değişken grubu yapıldıktan sonra, işlem hattınızda o grup içindeki tüm değişkenleri kullanın.After a variable group is made, use any variables within that group in your pipeline. Değişken grubu kullanmahakkında daha fazla bilgi edinin.Read more on How use a variable group.

Değişken grubunda aşağıdaki değişkenleri bildirin:Declare the following variables in the variable group:

  • publisherId: Market yayımcısının KIMLIĞI.publisherId: ID of your marketplace publisher.
  • extensionId: Dosyanızda vss-extension.jsolarak bildirildiği şekilde uzantınızın KIMLIĞI.extensionId: ID of your extension, as declared in the vss-extension.json file.
  • extensionName: Dosyanızda vss-extension.jsolarak bildirildiği şekilde uzantınızın adı.extensionName: Name of your extension, as declared in the vss-extension.json file.
  • artifactName: VSıX dosyası için oluşturulmakta olan yapıtın adı.artifactName: Name of the artifact being created for the VSIX file.

Yeni bir Visual Studio Market hizmet bağlantısı oluşturun ve tüm işlem hatları için erişim izinleri verin.Create a new Visual Studio Marketplace service connection and grant access permissions for all pipelines. Hizmet bağlantısı oluşturma hakkında daha fazla bilgi için bkz. hizmet bağlantıları.For more information about creating a service connection, see Service connections.

Yeni hizmet bağlantı bölmesini gösteren ekran görüntüsü.

Yeni Visual Studio Market hizmet bağlantı bölmesini gösteren ekran görüntüsü.

YAML ile yeni bir işlem hattı oluşturmak için aşağıdaki örneği kullanın.Use the following example to create a new pipeline with YAML. İlk işlem hattınızı ve YAML şemasınıoluşturma hakkında daha fazla bilgi edinin.Learn more about how to Create your first pipeline and YAML schema.

trigger: 
- master

pool:
  vmImage: "ubuntu-latest"

variables:
  - group: variable-group # Rename to whatever you named your variable group in the prerequisite stage of step 6

stages:
  - stage: Run_and_publish_unit_tests
    jobs:
      - job:
        steps:
          - task: TfxInstaller@3
            inputs:
              version: "v0.7.x"
          - task: Npm@1
            inputs:
              command: 'install'
              workingDir: '/TaskDirectory' # Update to the name of the directory of your task
          - task: Bash@3
            displayName: Compile Javascript
            inputs:
              targetType: "inline"
              script: |
                cd TaskDirectory # Update to the name of the directory of your task
                tsc
          - task: Npm@1
            inputs:
              command: 'custom'
              workingDir: '/TestsDirectory' # Update to the name of the directory of your task's tests
              customCommand: 'testScript' # See the definition in the explanation section below - it may be called test
          - task: PublishTestResults@2
            inputs:
              testResultsFormat: 'JUnit'
              testResultsFiles: '**/ResultsFile.xml'
  - stage: Package_extension_and_publish_build_artifacts
    jobs:
      - job:
        steps:
          - task: TfxInstaller@3
            inputs:
              version: "v0.7.x"
          - task: Npm@1
            inputs:
              command: 'install'
              workingDir: '/TaskDirectory' # Update to the name of the directory of your task
          - task: Bash@3
            displayName: Compile Javascript
            inputs:
              targetType: "inline"
              script: |
                cd TaskDirectory # Update to the name of the directory of your task
                tsc
          - task: QueryAzureDevOpsExtensionVersion@3
            inputs:
              connectTo: 'VsTeam'
              connectedServiceName: 'ServiceConnection' # Change to whatever you named the service connection
              publisherId: '$(PublisherID)'
              extensionId: '$(ExtensionID)'
              versionAction: 'Patch'
              outputVariable: 'Task.Extension.Version'
          - task: PackageAzureDevOpsExtension@3
            inputs:
              rootFolder: '$(System.DefaultWorkingDirectory)'
              publisherId: '$(PublisherID)'
              extensionId: '$(ExtensionID)'
              extensionName: '$(ExtensionName)'
              extensionVersion: '$(Task.Extension.Version)'
              updateTasksVersion: true
              updateTasksVersionType: 'patch'
              extensionVisibility: 'private' # Change to public if you're publishing to the marketplace
              extensionPricing: 'free'
          - task: CopyFiles@2
            displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)"
            inputs:
              Contents: "**/*.vsix"
              TargetFolder: "$(Build.ArtifactStagingDirectory)"
          - task: PublishBuildArtifacts@1
            inputs:
              PathtoPublish: '$(Build.ArtifactStagingDirectory)'
              ArtifactName: '$(ArtifactName)'
              publishLocation: 'Container'
  - stage: Download_build_artifacts_and_publish_the_extension
    jobs:
      - job:
        steps:
          - task: TfxInstaller@3
            inputs:
              version: "v0.7.x"
          - task: DownloadBuildArtifacts@0
            inputs:
              buildType: "current"
              downloadType: "single"
              artifactName: "$(ArtifactName)"
              downloadPath: "$(System.DefaultWorkingDirectory)"
          - task: PublishAzureDevOpsExtension@3
            inputs:
              connectTo: 'VsTeam'
              connectedServiceName: 'ServiceConnection' # Change to whatever you named the service connection
              fileType: 'vsix'
              vsixFile: '/Publisher.*.vsix'
              publisherId: '$(PublisherID)'
              extensionId: '$(ExtensionID)'
              extensionName: '$(ExtensionName)'
              updateTasksVersion: false
              extensionVisibility: 'private' # Change to public if you're publishing to the marketplace
              extensionPricing: 'free'

CI ve PR Tetikleyicileri gibi tetikleyicilerle ilgili daha fazla yardım için bkz. işlem hatlarını tetikleyen olayları belirtme.For more help with triggers, such as CI and PR triggers, see Specify events that trigger pipelines.

Not

Her iş yeni bir Kullanıcı Aracısı kullanır ve bağımlılıkların yüklenmesini gerektirir.Each job uses a new user agent and requires dependencies to be installed.

Ardışık düzen aşamalarıPipeline stages

Bu bölüm, işlem hattı aşamalarını nasıl çalıştığını anlamanıza yardımcı olur.This section helps you understand how the pipeline stages work.

Aşama: birim testlerini çalıştırma ve yayımlamaStage: Run and publish unit tests

Bu aşama, birim testlerini çalıştırır ve test sonuçlarını Azure DevOps 'a yayımlar.This stage runs unit tests and publishes test results to Azure DevOps.

Birim testlerini çalıştırmak için, dosyadaki package.jsözel bir komut dosyası ekleyin.To run unit tests, add a custom script to the package.json file. Örnek:For example:

"scripts": {
    "testScript": "mocha ./TestFile --reporter xunit --reporter-option output=ResultsFile.xml"
},
  1. Derleme aracısında TFX-CLI 'yi yüklemek için "Azure DevOps için Node CLı (TFX-CLI)" ekleyin.Add "Use Node CLI for Azure DevOps (tfx-cli)" to install the tfx-cli onto your build agent.

  2. "Install" komutuyla "NPM" görevini ekleyin ve klasörü package.jsdosya ile hedefleyin.Add the "npm" task with the "install" command and target the folder with the package.json file.

  3. TypeScript 'ı JavaScript 'e derlemek için "Bash" görevini ekleyin.Add the "Bash" task to compile the TypeScript into JavaScript.

  4. "Özel" komutuyla "NPM" görevini ekleyin, birim testlerini içeren klasörü hedefleyin ve testScript komut olarak giriş yapın.Add the "npm" task with the "custom" command, target the folder that contains the unit tests, and input testScript as the command. Aşağıdaki girdileri kullanın:Use the following inputs:

    • Komut: özelCommand: custom
    • package.jsiçeren çalışma klasörü:/TestsDirectoryWorking folder that contains package.json: /TestsDirectory
    • Komut ve bağımsız değişkenler: testScriptCommand and arguments: testScript
  5. "Test Sonuçları Yayımla" görevini ekleyin.Add the "Publish Test Results" task. Mocha XUnit Reporter kullanıyorsanız, sonuç biçiminin "JUnit" olduğundan ve "XUnit" olmadığından emin olun.If you're using the Mocha XUnit reporter, ensure that the result format is "JUnit" and not "XUnit." Arama klasörünü kök dizine ayarlayın.Set the search folder to the root directory. Aşağıdaki girdileri kullanın:Use the following inputs:

    • Test sonucu biçimi: JUnitTest result format: JUnit
    • Test sonuçları dosyaları: * */ResultsFile.xmlTest results files: **/ResultsFile.xml
    • Arama klasörü: $ (System. DefaultWorkingDirectory)Search folder: $(System.DefaultWorkingDirectory)

Test sonuçları yayımlandıktan sonra, Testler sekmesinin altındaki çıktı şöyle görünmelidir:After the test results have been published, the output under the tests tab should look like this:

Test sonucu örneği ekran görüntüsü.

Aşama: uzantıyı paketleyin ve derleme yapıtları yayımlayınStage: Package the extension and publish build artifacts

  1. Derleme aracısında TFX-CLI 'yi yüklemek için "Azure DevOps için Node CLı (TFX-CLI)" ekleyin.Add "Use Node CLI for Azure DevOps (tfx-cli)" to install the tfx-cli onto your build agent.

  2. "Install" komutuyla "NPM" görevini ekleyin ve klasörü package.jsdosya ile hedefleyin.Add the "npm" task with the "install" command and target the folder with the package.json file.

  3. TypeScript 'ı JavaScript 'e derlemek için "Bash" görevini ekleyin.Add the "Bash" task to compile the TypeScript into JavaScript.

  4. Mevcut uzantı sürümünü sorgulamak için "sorgu uzantısı sürümü" görevini ekleyin.Add the "Query Extension Version" task to query the existing extension version. Aşağıdaki girdileri kullanın:Use the following inputs:

    • Bağlan: Visual Studio MarketConnect to: Visual Studio Marketplace
    • Visual Studio Market (hizmet bağlantısı): hizmet bağlantısıVisual Studio Marketplace (Service connection): Service Connection
    • Yayımcı KIMLIĞI: Visual Studio Market yayımcısının KIMLIĞIPublisher ID: ID of your Visual Studio Marketplace publisher
    • Uzantı KIMLIĞI: dosyadaki vss-extension.jsuzantınızın KIMLIĞIExtension ID: ID of your extension in the vss-extension.json file
    • Sürümü artır: Düzeltme EkiIncrease version: Patch
    • Çıkış değişkeni: Task. Extension. VersionOutput Variable: Task.Extension.Version
  5. Uzantıları JSON bildirimine göre paketlemek için "paket uzantısı" görevini ekleyin.Add the "Package Extension" task to package the extensions based on manifest Json. Aşağıdaki girdileri kullanın:Use the following inputs:

    • Kök bildirimler klasörü: bildirim dosyasını içeren kök dizine Işaret eder.Root manifests folder: Points to root directory that contains manifest file. Örneğin, $ (System. DefualtWorkingDirectory) kök dizindir.For example, $(System.DefualtWorkingDirectory) is the root directory.
    • Bildirim dosyası (ler): üzerinde vss-extension.js.Manifest file(s): vss-extension.json.
    • Yayımcı KIMLIĞI: Visual Studio Market yayımcısının KIMLIĞI.Publisher ID: ID of your Visual Studio Marketplace publisher.
    • Uzantı KIMLIĞI: dosyanızdaki vss-extension.jsuzantınızın KIMLIĞI.Extension ID: ID of your extension in the vss-extension.json file.
    • Uzantı adı: dosyanızdaki vss-extension.jsuzantınızın adı.Extension Name: Name of your extension in the vss-extension.json file.
    • Uzantı sürümü: $ (Task. Extension. Version).Extension Version: $(Task.Extension.Version).
    • Geçersiz kılma görevleri sürümü: checked (true).Override tasks version: checked (true).
    • Geçersiz kılma türü: yalnızca Patch (1.0. r) öğesini değiştirin.Override Type: Replace Only Patch (1.0.r).
    • Uzantı görünürlüğü: uzantı hala geliştirilmeye devam ediyorsa, değeri özel olarak ayarlayın.Extension Visibility: If the extension is still in development, set the value to private. Uzantıyı herkese serbest bırakmak için değeri public olarak ayarlayın.To release the extension to the public, set the value to public.
  6. Yayımlanan dosyaları kopyalamak için "dosyaları kopyala" görevini ekleyin.Add the "Copy files" task to copy published files. Aşağıdaki girdileri kullanın:Use the following inputs:

    • İçerik: bir yapıt olarak yayımlamak için kopyalanması gereken tüm dosyalarContents: All of the files that need to be copied for publishing them as an artifact
    • Hedef klasör: dosyaların kopyalandığı klasörTarget folder: The folder that the files get copied to
      • Örneğin: $ (Build. ArtifactStagingDirectory)For example: $(Build.ArtifactStagingDirectory)
  7. Yapıtları diğer işlerde veya işlem hatlarında kullanılmak üzere yayımlamak için "derleme yapılarını Yayımla" ekleyin.Add "Publish build artifacts" to publish the artifacts for use in other jobs or pipelines. Aşağıdaki girdileri kullanın:Use the following inputs:

    • Yayımlanacak yol: yayımlanmakta olan dosyaları içeren klasörün yolu.Path to publish: The path to the folder that contains the files that are being published.
      • Örneğin: $ (Build. ArtifactStagingDirectory).For example: $(Build.ArtifactStagingDirectory).
    • Yapıt adı: yapıt için verilen ad.Artifact name: The name given to the artifact.
    • Yapıt yayımlama konumu: yapıtı sonraki işlerde kullanmak için "Azure Pipelines" seçeneğini belirleyin.Artifacts publish location: Choose "Azure Pipelines" to use the artifact in future jobs.

Aşama: derleme yapıtları Indirin ve uzantıyı yayımlayınStage: Download build artifacts and publish the extension

  1. Derleme aracısında TFX-CLI 'yi yüklemek için "Azure DevOps için Node CLı (TFX-CLI)" ekleyin.Add "Use Node CLI for Azure DevOps (tfx-cli)" to install the tfx-cli onto your build agent.

  2. Yapıtları yeni bir iş üzerine indirmek için "derleme yapılarını Indir" görevini ekleyin.Add the "Download build artifacts" task to download the artifacts onto a new job. Aşağıdaki girdileri kullanın:Use the following inputs:

    • Tarafından üretilen yapıtları indir: yapıtı aynı işlem hattından yeni bir iş üzerine indiriyorsanız, "geçerli derleme" yi seçin.Download artifacts produced by: If you're downloading the artifact on a new job from the same pipeline, select "Current build." Yeni bir işlem hattına indiriyorsanız, "belirli derleme" i seçin.If you're downloading on a new pipeline, select "Specific build."
    • İndirme türü: yayımlanan tüm dosyaları indirmek için "belirli Yapıt" seçeneğini belirleyin.Download type: Choose "Specific artifact" to download all files that were published.
    • Yapıt adı: Yayınlanan yapıt adı.Artifact name: The published artifact's name.
    • Hedef dizin: dosyaların indirileceği klasör.Destination directory: The folder where the files should be downloaded.
  3. İhtiyacınız olan son görev "uzantı Yayımla" görevidir.The last task that you need is the "Publish Extension" task. Aşağıdaki girdileri kullanın:Use the following inputs:

    • Bağlan: Visual Studio MarketConnect to: Visual Studio Marketplace
    • Visual Studio Market bağlantısı: ServiceConnectionVisual Studio Marketplace connection: ServiceConnection
    • Giriş dosyası türü: VSıX dosyasıInput file type: VSIX file
    • VSıX dosyası:/Publisher. *. vsixVSIX file: /Publisher.*.vsix
    • Yayımcı KIMLIĞI: Visual Studio Market yayımcısının KIMLIĞIPublisher ID: ID of your Visual Studio Marketplace publisher
    • Uzantı KIMLIĞI: dosyadaki vss-extension.jsuzantınızın KIMLIĞIExtension ID: ID of your extension in the vss-extension.json file
    • Uzantı adı: dosyadaki vss-extension.jsuzantınızın adıExtension Name: Name of your extension in the vss-extension.json file
    • Uzantı görünürlüğü: özel veya genelExtension visibility: Either private or public

İsteğe bağlı: uzantınızı yükleyip test edinOptional: Install and test your extension

Yalnızca birkaç adımda sizinle paylaşılan bir uzantı yükleyebilirsiniz:Install an extension that is shared with you in just a few steps:

  1. Kuruluş denetim masasından ( https://dev.azure.com/{organization}/_admin ), proje koleksiyonu yönetim sayfasına gidin.From your organization control panel (https://dev.azure.com/{organization}/_admin), go to the project collection administration page.
  2. Uzantılar sekmesinde, uzantınızı "benimle paylaşılan Uzantılar" grubunda bulun ve uzantı bağlantısını seçin.In the Extensions tab, find your extension in the "Extensions Shared With Me" group and select the extension link.
  3. Uzantıyı yükler.Install the extension.

Uzantılar sekmesini göremiyorsanız, https://dev.azure.com/{organization}/_admin bir projenin yönetim sayfasına değil, Denetim Masası 'nda (proje koleksiyonu düzeyinde yönetim sayfası) olduğunuzdan emin olun.If you can't see the Extensions tab, make sure you're in the control panel (the administration page at the project collection level, https://dev.azure.com/{organization}/_admin) and not the administration page for a project.

Uzantılar sekmesini görmüyorsanız, uzantılar kuruluşunuz için etkin değildir.If you don't see the Extensions tab, then extensions aren't enabled for your organization. Visual Studio Iş ortağı programı 'na katılarak uzantılar özelliğine erken erişim sağlayabilirsiniz.You can get early access to the extensions feature by joining the Visual Studio Partner Program.

Azure DevOps uzantılarını paketleyip Visual Studio Market yayımlamak için derleme ve sürüm görevlerinin Azure DevOps uzantı görevleriniindirebilirsiniz.For build and release tasks to package and publish Azure DevOps Extensions to the Visual Studio Marketplace, you can download Azure DevOps Extension Tasks.