13

我想使用構建後事件自動創建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

可能重複(http://stackoverflow.com/questions/2243593/determine-assembly-version-during-a-post-build-event) – sll

回答

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" 
[A後生成事件期間確定大會的版本?]的
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> 
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的「$完成版本$「令牌(以及其他)

查看此Nuget article獲取更多標記和信息。

3)使用以下郵政建立在你把一個.csproj.nuspec文件中的每個項目的事件(請刪除回車鍵):

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和後生成事件命令會是什麼樣子:

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文件夾下有一個本地副本。

請注意,我們不打電話給nuget與.nuspec文件,我們是 直接與.csproj調用它!

該策略還將包括Nuget在安裝軟件包時創建的 packages.xml中聲明的所有Project依賴項。 (自動,每次你建立)

大功告成!現在改變大會和文件版本在

項目>屬性>大會信息

重要:如果設置了$作者$和/或$描述$令牌,填補也是大會的公司及說明字段在這裏。如果遇到麻煩,請刪除$ author $和/或$ description $標記並嘗試再次編譯。

,建立自己的項目,你會看到在/ GeneratedPackages文件夾您在項目屬性中設置的版本的MyLib.X.X.X.X.nupack。如果你設置了依賴關係,你會發現它已經被自動包含爲包依賴關係。

我們在Jenkins CI服務器上使用此策略來自動構建解決方案,並將包從GeneratedPackages複製到我們的定製NugetServer。

您也可以完成後生成事件與

nuget push 

要生成的包發送到的NuGet服務器

問題發佈:

正如在評論中提到,有是一個不允許Nuget.exe在RELEASE模式下生成軟件包的問題。

對於這個腳本每一個項目:

  1. 項目屬性>構建
  2. 在「配置」下拉列表中選擇「所有配置」
  3. 爲了修復它做到這一點在「輸出」部分,更改「輸出路徑:」字段,例如,我目前使用「bin \」(不包括cuotes)

+1

如果配置設置爲調試,這將起作用。但是,只要我將其更改爲Release,然後出現異常「無法找到路徑\ bin \ Debug \ MyDll.dll」。確保項目已經建成。這意味着,nuget仍在查看Debug文件夾而不是Release。有任何想法嗎? – sventevit

+1

我也發現了這個問題。我應該通知Nuget團隊。要修復它,DEBUG和RELEASE文件夾應該是平等的。唯一需要注意的是當你從一種模式切換到另一種模式時,你應該重建解決方案。 對於這個腳本每一個項目:1. 項目屬性>構建 2.在「配置」下拉列表中選擇「所有配置」 3.在「輸出繼電器」部分中,更改「輸出路徑:」字段中,例如,我目前使用「bin」(沒有cuotes) 有了這個修復,Nuget.exe將在DEBUG和RELEASE中生成DE包 – sesispla

+1

@sesispla @sventevit您需要添加一個附加包設置:'-Properties「配置= $(配置);平臺= $(平臺)「'這將允許它在發行版中工作而不更改輸出目錄。 –

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包「$(SolutionDir)MyLib.nuspec」 並添加afterbuild元素的副本,你應該罰款。

相關問題