如何在 Visual Studio 2017 中 运行 MSBuild 打包目标

How to run MSBuild pack target in Visual Studio 2017

我的问题类似于this and this

我想在 Visual Studio 2017 RC 中打包一个 .Net Framework 库。在带有 project.json 构建系统的 VS 2015 中,我能够通过将自定义目标文件导入 .xproj 文件来完成此操作。这个自定义目标文件负责创建 nuspec 文件(如果它不存在),然后 运行ning nuget pack,将生成的包复制到本地 feed 位置等。

我是否需要在 2017 年做类似的事情(还没有做出认真的努力),或者我能以某种方式在我的 .csproj 文件中启用包目标吗?

文档 here 仅向 运行 显示来自命令行的包目标。

编辑: 我正在尝试下面的自定义目标,引用来自夜间构建的 Nuget 4.0 exe...

<Target Name="PackNugets"  AfterTargets="Build">    
  <PropertyGroup>
    <NugetV4Path>$([System.IO.Path]::GetFullPath('path to nuget.exe'))</NugetV4Path>
  </PropertyGroup>

  <Exec Command="&quot;$(NugetV4Path)\nuget.exe&quot; pack &quot;$(MSBuildProjectDirectory)$(PackageId).csproj&quot; -Symbols -OutputDirectory bin -Properties Configuration=Release"/>
</Target>

但是我得到以下错误

System.InvalidCastException: Unable to cast object of type 'System.String' to type 'NuGet.Frameworks.NuGetFramework'.
  at NuGet.ProjectManagement.NuGetProject.GetMetadata[T](String key)
  at NuGet.ProjectManagement.PackagesConfigNuGetProject..ctor(String folderPath, Dictionary`2 metadata)
  at CallSite.Target(Closure , CallSite , Type , Object , Dictionary`2 )
  at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
  at NuGet.CommandLine.ProjectFactory.AddDependencies(Dictionary`2 packagesAndDependencies)
  at NuGet.CommandLine.ProjectFactory.ProcessDependencies(PackageBuilder builder)
  at NuGet.CommandLine.ProjectFactory.CreateBuilder(String basePath, NuGetVersion version, String suffix, Boolean buildIfNeeded, PackageBuilder builder)
  at NuGet.Commands.PackCommandRunner.BuildFromProjectFile(String path)
  at NuGet.CommandLine.PackCommand.ExecuteCommand()
  at NuGet.CommandLine.Command.ExecuteCommandAsync()
  at NuGet.CommandLine.Command.Execute()
  at NuGet.CommandLine.Program.MainCore(String workingDirectory, String[] args)

与 csproj 中的某个属性有关? NugetFramework 是否引用 TargetFramework?

我在我的 csproj 中定位 net452,以防有帮助。

编辑: 该异常确实是关于 nuget 试图解析 TargetFramework,但尚不清楚它是在我的 csproj 还是在依赖项中失败...

我想知道同样的事情,所以我在 MSBuild 文件中进行了探索,即:C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild\Sdks\NuGet.Build.Tasks.Pack\build 并寻找 "Pack" 目标。

除此之外,我会参考一般的 MSBuild 命令行语法 here,但举几个例子:

msbuild.exe -t:Pack -p:IncludeSymbols=true
msbuild.exe -t:Pack -p:Configuration=Release -p:VersionSuffix="alpha" # or "-alpha" - not sure

编辑:对我的场景进行更多的研究和工作,我发现了这个 documentation 的重要属性。

编辑: VS2017 的最新更新已将打包操作添加到项目上下文菜单中,因此可以按如下方式更改以下操作:

  • AfterTargets=Pack
  • 删除 Exec 元素
  • 如果您的目标是多个框架,您可能必须在 NugetPackages Include 中的 \bin 之后插入一个 $(Configuration)

好的,this issue 帮我解决了。现在,我们必须使用 dotnet 而不是 msbuildnuget.

所以,我在导入的 .targets 文件中的自定义目标变成了

<Project ToolsVersion="15.0">
 <Target Name="PackNugets"  AfterTargets="AfterBuild">  

  <!-- Swap out nuget for dotnet and update the cli args -->
  <!-- Might actually be able to leave out the csproj path, since
       this target should run in the project directory. Test it first. -->
  <Exec Command="dotnet pack &quot;$(MSBuildProjectDirectory)$(PackageId).csproj&quot; --no-build --include-symbols -o bin -c Release"/>

  <!-- If you want to copy to a local feed -->
  <ItemGroup>
    <NugetPackages Include="$(MSBuildProjectDirectory)\bin$(PackageId).$(PackageVersion)*.nupkg"/>
   </ItemGroup>

  <Copy SourceFiles="@(NugetPackages)" DestinationFolder="path to local feed" />
 </Target>  
</Project>

请注意,dotnet packmsbuild /t:Pack 目前不支持 .NET Framework 项目。他们只处理 NETCore 项目。

如果您想使用此推送 nuget,您甚至可以改进

<Target Name="PushNugetPackage" AfterTargets="Pack" Condition="'$(Configuration)' == 'Release'">
  <Exec Command="nuget.exe push -Source &quot;mysource&quot; -ApiKey VSTS $(OutputPath)..$(PackageId).$(PackageVersion).nupkg" />
</Target>

它只会 运行 在你从上下文菜单中选择 pack 并且配置是 Release 之后,所以你不会推送调试包,如果你真的不需要它就删除那个条件

Source