Azure 关于YAML文件中的催眠的问题,何时使用

Azure 关于YAML文件中的催眠的问题,何时使用,azure,azure-devops,yaml,Azure,Azure Devops,Yaml,我想知道的是,在本例中,何时在YAML文件中使用hypen以用于azuredevops,实际上更令人困惑。我包括了下面的YAML文件,作为我的意思的演示 我希望我是正确的,我发现当我们使用列表项时会使用hypens-。所以,如果我看一下工作:有更多的工作,所以每个工作前面都有一个- 步骤包含任务,因此单个任务前面带有- 但当我看变量时。我希望它们是某种列表(我不是开发人员),那么它们是什么呢?因为单个变量前面没有- 和Pool一样:它没有宣传 与输入相同:我希望这里的-也适用于单个输入。因此,也

我想知道的是,在本例中,何时在YAML文件中使用hypen以用于azuredevops,实际上更令人困惑。我包括了下面的YAML文件,作为我的意思的演示

我希望我是正确的,我发现当我们使用列表项时会使用hypens-。所以,如果我看一下工作:有更多的工作,所以每个工作前面都有一个-

步骤包含任务,因此单个任务前面带有-

但当我看变量时。我希望它们是某种列表(我不是开发人员),那么它们是什么呢?因为单个变量前面没有-

和Pool一样:它没有宣传

与输入相同:我希望这里的-也适用于单个输入。因此,也许更好的问题是问什么是独立的池,变量和输入被视为为什么不使用hypen。我就是找不到答案

我希望我解释得足够清楚

问候,

约翰


YAML有两种类型的集合节点:序列和映射。当使用
-
时,表示序列项。序列项是序列的内容

当包含值的标识属性是它们的位置时,可以使用序列。例如,对于作业,您有第一个作业、第二个作业等。它们的顺序是有意义和重要的

另一方面,映射是包含键值对的集合。键通常是标量(即文本值,如
pool
vmImage
),值是任何类型的YAML节点。对于映射,值的标识属性是其关键。例如,对于变量,它们的顺序并不重要,但它们的名称很重要

映射键通常由标量后面的
表示。例如,
jobs:
是一个映射键
jobs
,指示其值如下。在我们的例子中,值通过序列跟随

YAML所做的让人困惑的事情是,序列的额外缩进是不必要的。例如,在这个YAML中

a:
b:c
d:
e:
显然,键
a
具有值
b:c
,这是一个嵌套映射。键
d
的值为空,因为以下键
e
处于同一级别

但是,对于序列,您可以执行以下操作

a:
-b
c:
-d
e:
现在,
a
的值显然是
-b
,即嵌套序列。然而,
c
的值也不太明显地是嵌套序列
-d
,而
e:
停止前一个序列并开始一个新值。这对于理解YAML文件的结构很重要

现在,如果您有一行像
-job:Build
,实际上有两件事在进行:
-
启动一个序列项,
作业:
启动一个映射,该映射将作为该序列项的值

映射有两种不同的用途:一种用途是它们标识子结构,例如,作业具有
变量
步骤
。不能在具有某个值的作业中放置一行
droggeljug:
,因为这不是子结构的名称。在变量中,映射有不同的用途:可以使用相应的值定义任意数量的自由选择的名称。这是一个查找表,您可以稍后使用它说“请给我映射到
解决方案
”的值,您将得到
***.sln

因此,YAML映射用于两种不同的用例:命名子结构和查找表(名称映射来自于此)。甚至YAML文件的根节点也是一种映射,具有诸如
trigger
stages
pool
等键

回到为什么
变量
不是一个列表(或者,用YAML术语来说,序列)的问题:变量名称应该是唯一的。在序列中,可以有两个名称相同的项:

变量:
-解决方案:'***.sln'
-解决方案:“droggeljug”
在YAML映射中,禁止使用相同的键。我们不使用序列来明确指示键必须是唯一的


为什么
池:
不包含序列的问题的答案是另一个:这是一个已知的子结构,它不是序列。它是一个结构,可以包含
名称
需求
vmImage
,因此它作为YAML映射给出。这里不能有多个池,因此一个sequence没有任何意义。

非常感谢Flyx,现在一切都很有意义。我感谢你提供的额外深度和示例。嗨,John,如果Flyx的答案完美地解释了你的问题,你可以接受它作为一个答案,它可以帮助其他人在同样困惑时找到这个答案,谢谢。
trigger:
- none
stages:

- stage: Build
pool:
  vmImage: 'windows-latest'


jobs:
- job: Build


  variables:
    solution: '**/*.sln'
    buildPlatform: 'Any CPU'
    buildConfiguration: 'Release'

  steps:
  - task: NuGetToolInstaller@1

  - task: NuGetCommand@2
    inputs:
      restoreSolution: '$(solution)'

  - task: VSBuild@1
    inputs:
      solution: '$(solution)'
      msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
      platform: '$(buildPlatform)'
      configuration: '$(buildConfiguration)'


  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Pipeline.Workspace)'
      artifact: 'drop'
      publishLocation: 'pipeline'

- stage: Deploy
pool:
  vmImage: 'windows-latest'

jobs:
- job: Deploy

  steps:

  - task: DownloadPipelineArtifact@2
    inputs:
      buildType: 'current'
      artifactName: 'drop'
      targetPath: '$(Pipeline.Workspace)'


  - task: AzureWebApp@1
    inputs:
      azureSubscription: 'tofreewebapp'
      appType: 'webApp'
      appName: 'freewebappdave'
      package: '$(Pipeline.Workspace)/drop/*.*'
      deploymentMethod: 'auto'