在Azure DevOps构建管道中传递NuGet'Pack'参数

时间:2019-07-31 07:37:31

标签: azure-devops nuget nuget-package azure-pipelines

在我的Azure DevOps构建管道中,我添加了一个 pack 命令类型(版本2. *)的NuGet任务。

我正在尝试传递-Exclude ***.tt参数,以便在从其他项目引用时将这些文件排除在外。但是,在生成的NuGet程序包中,这些.tt文件显示在Content文件夹中。

写在主机日志中的命令是:

nuget.exe pack PROJECTNAME.csproj -NonInteractive -OutputDirectory SOME_OUTPUTPATH -Properties "Configuration=release;\"-Exclude ***.tt\"" -Verbosity Detailed

如您所见,exclude不是属性的一部分,而应作为单独的-Exclude参数。

任何想法我该如何实现?非常感谢!

添加了屏幕截图和YAML:

enter image description here

steps:
- task: NuGetCommand@2
  displayName: 'NuGet pack'
  inputs:
    command: pack
    packagesToPack: ProjectName.csproj
    buildProperties: '-Exclude ***.tt'

3 个答案:

答案 0 :(得分:1)

  

在Azure DevOps构建管道中传递NuGet'Pack'参数

您不能以这种方式使用参数-Exclude。那是因为此参数用于.nuspec而不是.csproj,所以-Exclude不是项目文件中的Property,因此我们不能将其与.csproj一起使用。

检查nuget文档nuget pack command (NuGet CLI)时,可以看到以下示例:

nuget pack Package.nuspec -exclude "*.exe" -exclude "*.bat"

如果要使用项目文件.tt排除.csproj个文件,则必须转到项目文件以排除此类文件,例如:

  <ItemGroup>
    <None Update="**.tt">
      <Pack>False</Pack>
      <Generator>TextTemplatingFileGenerator</Generator>
      <LastGenOutput>Test.txt</LastGenOutput>
    </None>
    ...
  </ItemGroup>

如果您不想修改源文件,则可以创建.nuspec文件,然后将.nuspec文件打包为参数-Exclude

例如,我创建以下.nuspec

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
    <id>MyTestCore</id>
    <version>6.0.0</version>
    <authors>TestContentFile</authors>
    <owners>TestContentFile</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package Description</description>
    <contentFiles>
      <files include="any/any/Data.xml" buildAction="content" flatten="true" copyToOutput="true"/>
      <files include="any/any/Test.cs" buildAction="content" flatten="true" copyToOutput="true"/>
    </contentFiles>
  </metadata>

  <files>
    <file src="contentFiles/any/any/Data.xml" target="contentFiles/any/any/Data.xml" />
    <file src="contentFiles/any/any/Test.cs" target="contentFiles/any/any/Test.cs" />
  </files>
</package>

如果我使用参数-Exclude "**\*.cs"打包此.nuspec文件:

enter image description here

那么我们知道,.cs被排除在包装中。

希望这会有所帮助。

答案 1 :(得分:1)

-Excludenuget pack .csproj一起使用时,需要为完整路径提供排除的文件。但是这里还有另一个问题,Azure DevOps将-Exclude附加到-Properties上,并且忽略了这种遗漏,因此我们需要以另一种方式添加-Exclude,如何?在NuGet custom命令中:

- task: NuGetCommand@2
  inputs:
    command: custom
    arguments: 'pack "$(Build.SourcesDirectory)\Path\To\.csproj" -Exclude "$(Build.SourcesDirectory)\Path\to\*.tt"'

在尝试使用常规-Exclude的日志时,您可以看到nuget打包了我的.exe文件:

enter image description here

这里是我执行自定义命令后的日志,没有.exe

enter image description here

我的任务是:

- task: NuGetCommand@2
  inputs:
    command: custom
    arguments: 'pack "$(Build.SourcesDirectory)\TestVars\TestVars\TestVars.csproj" -Exclude "$(Build.SourcesDirectory)\TestVars\TestVars\bin\Debug\*.exe"'

答案 2 :(得分:0)

它在Visual Studio 2015中为我解决了

<ItemGroup>
    <None Include="**.tt">
        <Pack>False</Pack>
        <Generator>TextTemplatingFileGenerator</Generator>
        <LastGenOutput>Test.txt</LastGenOutput>
    </None>
    ...
</ItemGroup>