15

我想使用构建后事件自动创建一个 nuget 包,然后将其复制到我们网络上的共享文件夹中,如下所示(版本号 1.0.0.0. 在 MyLib.nuspec 文件中指定):

nuget.exe pack "$(SolutionDir)MyLib.nuspec"
xcopy /Y "$(TargetDir)MyLib.1.0.0.0.nupkg" \\folder\subfolder\NuGetPackages

这可行,但现在我想更新此脚本,以便它也包含程序集版本,但我无法在构建后事件中获取程序集版本。我需要这样的东西:

nuget.exe pack -Version $(AssemblyVersion) "$(SolutionDir)MyLib.nuspec"
xcopy /Y "$(TargetDir)MyLib." + $(AssemblyVersion) + ".nupkg" \\folder\subfolder\NuGetPackages

但是 $(AssemblyVersion) 变量不存在......有什么想法吗?

4

4 回答 4

6

这个帖子构建脚本对我有用。它在每个构建中打包并发布我的开发版本。很简单。

del $(ProjectDir)bin\Debug\*.nupkg
"$(ProjectDir)NuGet.exe" pack "$(ProjectDir)MyProject.csproj"
forfiles /P $(ProjectDir)bin\Debug\ /m *.nupkg /c "cmd /c "$(ProjectDir)NuGet.exe" push @FILE -Source \\SHARE\NuGet"
于 2013-05-31T19:51:15.090 回答
4

试试这个:

编辑您的 .csproj 文件并添加此块:

<Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
        <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
    </GetAssemblyIdentity>
    <Exec Command="xcopy /Y $(TargetDir)MyLib.%(CurrentAssembly.Version).nupkg \\folder\subfolder\NuGetPackages"></Exec>
</Target>
于 2011-10-24T16:42:36.230 回答
4

尝试以下操作:

1) 重命名 .nuspec 以匹配 .csproj 名称:

如果您的项目是: MyLib.csproj

将 MyLib.nuspec 重命名为MyLib.csproj.nuspec

2) 修改您的 .nuspec 文件,如下所示:

<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <version>$version$</version>
    <authors>$author$</authors>
    <id>$id$</id>
    <title>$id$</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <summary>$description$</summary>
  </metadata>
</package>

在这里,工作由 Nuget 的“$version$”令牌(和其他)完成

查看这篇Nuget 文章以获取更多令牌和信息。

3)在您放置 .csproj.nuspec 文件的每个项目中使用以下构建后事件(请删除 Enter 键):

mkdir "$(SolutionDir)GeneratedPackages"

"$(SolutionDir).nuget\nuget.exe" pack "$(ProjectPath)" 
-OutputDirectory "$(SolutionDir)GeneratedPackages" 
-basepath "$(SolutionDir)$(ProjectName)\$(OutDir)"

如果我们有一个解决方案 C:\MySolution\MyLib.sln 和 c:\MySolution\MyLib\MyLib.csproj 的项目,我们的 .nuspec 文件应该是 c:\MySolution\MyLib\MyLib.csproj.nuspec 和 Post Build事件命令看起来像:

mkdir "C:\MySolution\GeneratedPackages"

"C:\MySolution\.nuget\nuget.exe" pack "C:\MySolution\MyLib\MyLib.csproj" 
-OutputDirectory "C:\MySolution\GeneratedPackages" 
-basepath "C:\MySolution\MyLib\bin\debug\"

修复 nuget.exe 的路径。在我的情况下,我使用的是 Nuget“自动重新生成构建时缺少的依赖项”,并且我在 .nuget 文件夹下的解决方案中有一个本地副本。

请注意,我们不是用 .nuspec 文件调用 nuget,而是直接用 .csproj 调用它!

此策略还将包括 Nuget 在安装包时创建的 packages.xml 中声明的所有项目依赖项。(自动,每次构建时)

你完成了!现在更改程序集和文件版本

项目 > 属性 > 装配信息

重要提示:如果您设置了 $author$ 和/或 $description$ 令牌,请在此处填写大会的公司和说明字段。如果遇到问题,请删除 $author$ 和/或 $description$ 标记并尝试再次编译。

并构建您的项目,您将在 /GeneratedPackages 文件夹中看到带有您在项目属性中设置的版本的 MyLib.XXXXnupack。如果您设置依赖项,您会看到它已自动包含为包依赖项。

我们正在将此策略与 Jenkins CI 服务器一起使用,以自动构建解决方案并将包从 GeneratedPackages 复制到我们的自定义 NugetServer。

您还可以使用

nuget push

将生成的包发送到 Nuget 服务器

发布中的问题:

如评论中所述,存在不允许 Nuget.exe 在 RELEASE 模式下生成包的问题。

这样做是为了修复它:

对于使用此脚本的每个项目:

  1. 项目属性 > 构建
  2. 在“配置”下拉菜单中选择“所有配置”
  3. 在“输出”部分,更改“输出路径:”字段,例如我目前使用的是“bin\”(不带cuotes)
于 2012-02-23T19:59:14.097 回答
1

我尝试了 giammin 的建议,并通过一些调整让这对我有用:

<Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
       <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
    </GetAssemblyIdentity>
    <Exec Command="copy /Y $(TargetPath) $(ProjectDir)Versions\$(TargetName)_%(CurrentAssembly.Version).dll" Condition="'$(ConfigurationName)' == 'Stage'" />
</Target>

我添加了“条件”属性,以便我可以指定何时将其构建到特定位置(在我的情况下为回滚创建备份)。此外,“xcopy”给了我错误......但是一个正常的“副本“ 不是。

然后,在我的构建后事件中,我有这样的事情:

copy $(TargetDir)*.dll \\dev-server\folder

IF NOT "$(ConfigurationName)" == "Stage" EXIT

mkdir "$(ProjectDir)Versions"
copy /Y "$(TargetPath)" \\stage-server\folder

我希望这一切都以某种方式有所帮助。

请注意,构建后事件在 csproj XML 的“AfterBuild”元素之前执行。

所以你可以在你发布构建事件中使用:nuget.exe pack "$(SolutionDir)MyLib.nuspec" 并为副本添加 afterbuild 元素,你应该没问题。

于 2012-03-29T23:23:15.793 回答