9

MSBuildおよびMSBuildコミュニティタスクの使用私は非常に簡単なことをしようとしています。

  1. アセンブリからバージョン情報を取得します。
  2. そのバージョン情報で.nuspecファイルを更新します。

私のMSBuildターゲットは次のようになります。

<Target Name="Package">
  <GetAssemblyIdentity AssemblyFiles="%(PackageDir.FullPath)\MyAssembly.dll">
    <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity" />
  </GetAssemblyIdentity>
  <XmlUpdate 
     Prefix="nu"
     Namespace="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"
     XmlFileName="%(PackageDir.FullPath)\MyAssembly.nuspec"
     XPath="/nu:package/nu:metadata/nu:version"
     Value="%(AssemblyIdentity.Version)" />
</Target>

私が抱えている問題は、NuGetPackタスクが2回実行されることです。1回目はアセンブリバージョンが欠落しているがパスが正しい、2回目はアセンブリバージョンが正しいがパスが欠落している!

出力は次のとおりです。

Updating Xml Document "D:\MyProject\package\MyAssembly.nuspec".
    1 node(s) selected for update.
  XmlUpdate Wrote: "".
  Updating Xml Document "\MyAssembly.nuspec".
D:\MyProject\MyProject.build(64,9): error : Could not find file
 'D:\MyAssembly.nuspec'.
Done Building Project "D:\MyProject\MyProject.build" (Package target(s)
) -- FAILED.

NuGetPackタスクも使用してみましたが、同様の結果が得られました。ヘルプは大歓迎です!

4

1 に答える 1

10

元の質問のコードが機能しない理由はまだわかりませんが、解決したようです。

連結によってパスを指定する代わりに (例: AssemblyFiles="%(PackageDir.FullPath)\MyAssembly.dll")、各パスを独自の項目に入れます。

<ItemGroup>
...
  <PackageVersionAssembly Include=".\build-artifacts\package\MyAssembly.dll"/>
  <NuSpecFile Include=".\build-artifacts\package\MyAssembly.nuspec"/>
...
</ItemGroup>

タスクに同じ変更を加え、.nuspec ファイルへの参照にも同じ変更を加えました。

新しい Package ターゲットは次のようになります。

<Target Name="Package">
  <GetAssemblyIdentity AssemblyFiles="@(PackageVersionAssembly)">
    <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity" />
  </GetAssemblyIdentity>
  <XmlUpdate 
     Prefix="nu"
     Namespace="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"
     XmlFileName="@(NuSpecFile)"
     XPath="/nu:package/nu:metadata/nu:version"
     Value="%(AssemblyIdentity.Version)" />
</Target>

これが他の人に役立つことを願っています!

于 2012-12-27T17:38:34.813 に答える