首页 文章

自动创建NuGet包作为构建过程的一部分

提问于
浏览
63

我有一个自动构建过程,我想扩展,所以我可以构建我通过NuGet分发的库 . 目前,运行nuget.exe来创建包是一个手动操作 .

What is the best way to setup VS 2010 so that my NuGet package (*.nupkg) file is the end result of a "Release" build?

请记住,我有一些软件包的其他文件(内容和工具) . 而且,在大多数情况下,我将多个项目合并到一个NuGet包中,以支持.NET 4,Silveright和Phone 7 .

(我应该澄清现有的"automated"进程是一个简单的批处理文件运行器,它使用命令行构建解决方案 . )

UPDATE

我想更新此讨论,因为问题尚未解决 . 虽然提供的@pravin链接很有帮助,但它并没有解决我在单个包中有多个项目以及PowerShell脚本,配置和源代码转换等其他内容的事实 .

我可以使用的最好的例子是具有.NET 4和Silverlight 5版本的程序集 . 它们分布在同一个包中 . 我不能使用post-build事件来创建包,因为包依赖于两个项目 .

9 回答

  • 10

    Nuget包CreateNewNuGetPackageFromProjectAfterEachBuild声称它可以做你想要的 . 还有documentation/project site.

  • 1

    可能运行良好的一件事是创建自定义MSBuild .proj文件 . 您可以在自定义脚本中定义几个目标,第一个在您的解决方案上执行编译 . 编译后执行的第二个目标将使用EXEC MSBuild任务来调用nuget.exe命令行实用程序 . 然后,更新批处理文件运行器以执行提供自定义项目文件作为参数的msbuild可执行文件 . 您可能已经在批处理脚本中使用MSBuild,在这种情况下,它只是参数交换的问题 . 您可以将自定义proj文件包含在解决方案的解决方案项中 . 如果您这样做,您可以轻松地在Visual Studio中添加外部工具引用,以快速测试您的自定义脚本,以确保它正在构建和生成您希望的包 .

    Sample MSBuild

    您可以将此作为起点:

    <Project DefaultTargets="Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
        <PropertyGroup>
          <SolutionFile></SolutionFile>
          <NugetExecutable>C:\PathToNuget\nuget.exe</NugetExecutable>
          <NuspecFile></NuspecFile>
        </PropertyGroup>
    
        <Target Name = "Compile">
            <MSBuild Projects="$(SolutionFile)" Properties="Configuration=Release" />
        </Target>
    
        <Target Name = "Package">
        <!-- You could use the MSBuild Copy task here to move the compiled code into
               a structure that fits your desired package format -->
          <Exec Command="&quot;$(NugetExecutable)&quot; pack $(NuspecFile)" />
        </Target>
    </Project>
    

    然后你会这样称呼:

    "C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Build.proj /p:SolutionFile=PathToSolution\App.sln;NuspecFile=foo.nuspec
    
  • 0

    我正在做你想要在我当前项目中实现的事情:

    每个程序集都内置在自己的nuget包中,并具有依赖性 .

    我通过在项目中创建一个我想要创建nuget包的包文件夹来解决它 . 在那里,我配置了一个nuspec文件,其中包含有关nupkg的必要信息

    在那里我制作了Nuget包结构所需的所有文件夹和不变的文件 .

    我在项目中添加了一个post build步骤,它将刚刚构建的文件复制到package文件夹中并运行 nuget.exe

    所以它是:

    • 建设项目 .

    • 将输出复制回项目的Package \ Lib .

    • 使用包文件夹中的nuspec文件运行 nuget.exe .

    • 将结果复制到输出的其余部分旁边的输出文件夹 .

    Nuget.exe必须位于系统上的固定文件夹和buildserver(脏解决方案)中,或者包含在构建中(不太脏) .

    Buildscript:

    Xcopy.exe /Y "$(TargetPath)" "$(ProjectDir)\Package\Lib" 
    cd "$(ProjectDir)Package" 
    "$(TargetDir)..\Buildscripts\Nuget.exe" pack MyPackage.nuspec xcopy /Y *.nupkg "$(TargetDir)"
    

    为了使用它,您唯一需要注意的是决定在哪里检查nuget.exe . 我在开发树的顶层创建了一个buildscripts文件夹 .

  • 32

    如果您在TFS 2010环境中,NuGetter project应解决自动创建nuget包的问题 . 它为整个构建创建了一个包 . 它实际上是一个TFS 2010构建工作流,通过调用带有一些参数的nuget.exe来完成工作 .

  • 7

    安装'NuGet.for.MSBuild'nuget包 . 不需要'.nuspec'文件,所需信息将从AssemblyInfo.cs中获取 .

    将构建设置为“释放”模式 . 构建完成后,nupkg文件将位于“bin / Release”文件夹中 .

    https://nuget4msbuild.codeplex.com/

  • 4

    一个简单的建议可能足够好......只需将它作为Postbuild事件放入.csproj文件中:

    <PropertyGroup>
        <PostBuildEvent>$(SolutionDir)<YourPathToNugetHere>\NuGet.exe pack $(ProjectPath) -OutputDirectory ..\..\$(OutDir) -IncludeReferencedProjects -Symbols -Properties Configuration=$(Configuration)</PostBuildEvent>
      </PropertyGroup>
    

    这将收集您的自定义.nuspec文件(需要命名为.csproj文件)并构建.nupkg .

    而已 .

    您甚至可以在Visual Studio Project设置中执行此操作 .

  • 1

    在您的sln中安装NuGet Powertools软件包,它将添加一个用于创建nupkg的构建目标,然后只需修改CI以运行该任务 . http://nuget.org/packages/NuGetPowerTools

  • 0

    我创建了一个名为NuBuild的NuGet项目类型(.nuproj)Visual Studio扩展,它可以做你想要的 . 它允许您从Visual Studio和MSBuild构建NuGet包 . 您可以从gallery安装它,也可以在github获取源代码 .

  • 7

    据我所知,你不能 .

    相反,请正确执行并拥有适当的构建环境/进程,在提交/推送到您的主存储库时触发构建脚本,执行以下操作:

    • 克隆/拉动更改 .

    • 构建解决方案 .

    • 构建包 .

    • 将包上传到包服务器 .

    您可以在VM或现有构建服务器上运行TeamCity,CruiseControl.NET或其他CI服务器 .

相关问题