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

时间:2017-01-31 19:18:51

标签: c# msbuild nuget visual-studio-2017

我的问题类似于thisthis

我想在Visual Studio 2017 RC中打包.Net Framework库。在带有project.json构建系统的VS 2015中,我能够通过将自定义目标文件导入.xproj文件来实现此目的。此自定义目标文件负责创建nuspec文件(如果它不存在),然后运行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还是依赖... ...

4 个答案:

答案 0 :(得分:6)

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

  • AfterTargets=Pack
  • 删除Exec元素
  • 如果您要定位多个框架,则可能需要在\$(Configuration) \bin之后插入NugetPackages Include

好的,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>

答案 1 :(得分:5)

我想知道同样的事情,所以我在MSBuild文件中进行了探索,即:C:\Program Files (x86)\Microsoft Visual Studio\2017\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这些重要属性。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果你想使用这个来推动nuget,你甚至可以改进Ken G answer

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

只有在您从上下文菜单中选择打包并且配置为发布后,它才会运行,因此您不会推送调试包,如果您真的不需要它,请删除该条件

Source