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

次のことを試してください。

1).csprojの名前と一致するように.nuspecの名前を変更します。

プロジェクトの場合: 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とPostBuildである必要があります。イベントコマンドは次のようになります。

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フォルダーの下にローカルコピーがあります。

.nu​​specファイルを使用してnugetを呼び出しているのではなく、.csprojを使用して直接呼び出していることに注意してください。

この戦略には、パッケージのインストール時にNugetが作成するpackages.xmlで宣言されたすべてのプロジェクト依存関係も含まれます。(自動的に、ビルドするたびに)

そして、あなたは完了です!次に、でアセンブリとファイルのバージョンを変更します

プロジェクト>プロパティ>アセンブリ情報

重要: $author$および/または$description$トークンを設定する場合は、ここにアセンブリの会社フィールドと説明フィールドも入力してください。問題が発生した場合は、$author$および/または$description$トークンを削除して、コンパイルを再試行してください。

プロジェクトをビルドすると、/GeneratedPackagesフォルダーにプロジェクトのプロパティで設定したバージョンのMyLib.XXXXnupackが表示されます。依存関係を設定すると、パッケージの依存関係として自動的に含まれていることがわかります。

この戦略をJenkinsCIサーバーで使用して、ソリューションを自動的に構築し、GeneratedPackagesからカスタムNugetServerにパッケージをコピーしています。

ビルド後のイベントを完了することもできます

nuget push

生成されたパッケージをNugetサーバーに送信するには

リリースの問題:

コメントで述べたように、Nuget.exeがRELEASEモードでパッケージを生成できないという問題があります。

それを修正するためにこれを行います:

このスクリプトを使用するすべてのプロジェクトについて:

  1. プロジェクトのプロパティ>ビルド
  2. [構成]ドロップダウンで、[すべての構成]を選択します
  3. [出力]セクションで、[出力パス:]フィールドを変更します。たとえば、現在「bin」を使用しています(キュートなし)。
于 2012-02-23T19:59:14.097 に答える
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 に答える
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

すべてが何らかの形で役立つことを願っています。

ビルド後のイベントは、csprojXMLの「AfterBuild」要素の前に実行されることに注意してください。

したがって、ビルド後のイベントでnuget.exeパック "$(SolutionDir)MyLib.nuspec"を使用して、コピーのafterbuild要素を追加するだけで問題ありません。

于 2012-03-29T23:23:15.793 に答える