我想使用post-build事件自动创建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)变量不存在......有什么想法吗?
答案 0 :(得分:5)
此帖子构建脚本适合我。它在每个版本上打包并发布我的开发版本。很简单。
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"
答案 1 :(得分:3)
试试这个:
编辑.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>
答案 2 :(得分:3)
尝试以下方法:
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 article以获取更多令牌和信息。
3)在您放置.csproj.nuspec文件的每个项目中使用以下Post Build Event(请删除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 Event Command看起来像:
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。 (每次你建立时自动)
你已经完成了!现在更改
中的程序集和文件版本项目&gt;属性&gt;装配信息
重要提示:如果您设置$ author $和/或$ description $标记,请在此处填写程序集的公司和说明字段。如果您遇到麻烦,请删除$ author $和/或$ description $ tokens并尝试再次编译。
并构建您的Project,您将在/ GeneratedPackages文件夹中看到MyLib.X.X.X.X.nupack以及您在Project Properties中设置的版本。如果设置依赖项,您将看到它已自动包含在Package Dependencies中。
我们正在与Jenkins CI服务器一起使用此策略来自动构建解决方案并将包从GeneratedPackages复制到我们的自定义NugetServer。
您还可以使用
完成帖子构建活动nuget push
将生成的包发送到Nuget Server
发布中的问题:
如评论中所述,存在一个问题,即不允许Nuget.exe在RELEASE模式下生成包。
这样做是为了解决它:
对于使用此脚本的每个项目:
答案 3 :(得分: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>
我添加了“Condition”属性,以便我可以指定何时将其构建到特定位置(在我的情况下为回滚创建备份)。另外,“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元素,你应该没问题。