![](/img/trans.png)
[英]My NuGet package doesn't seem to update in projects that use it as a dependency
[英]Compile .bond files of projects using my NuGet package
我有一個帶有 .bond 文件的 NuGet package。 我的 package 的用戶可以從我的 package's.bond 文件中的結構派生他們的 Bond 結構。
我希望在包含我的 NuGet package 時編譯用戶的 Bond 文件。 今天他們必須包括我的 NuGet 和 Bond.CSharp NuGet。 但是,我的 NuGet 已經引用了Bond.CSharp 。
如何創作我的 package 以便消費者不需要擁有自己的<PackageReference Include="Bond.CSharp"... />
?
Bond 代碼生成是從 Bond.CSharp 的構建目標運行的。
默認情況下,您使用的包的構建目標不會流向您的消費者。 PackageReference
的PrivateAssets
的默認值為"contentfiles;analyzers;build" 。
您可以在 csproj 的PackageReference
中覆蓋此行為:
<ItemGroup>
<PackageReference Include="Bond.CSharp" Version="[9.0.3]">
<!-- removing "build" from default so that consumers also run codegen -->
<PrivateAssets>contentfiles;analyzers</PrivateAssets>
</PackageReference>
</ItemGroup>
我假設您正在將基本結構編譯成 package 中的程序集。 Bond codegen 假設生成的代碼和運行時庫完全匹配,所以我使用了PackageReference
中綁定的完全匹配版本: [9.0.3]
您說您希望您的消費者能夠從您的 Bond 結構派生,因此您可能還希望配置他們的BondImportPath
以將 .bond 文件包含在您的 package 中。 為此,您需要
BondImportPath
設置為 package 目錄,其中包含 say.bond 文件。確保 .bond 文件包含在 package 中,在您的 package's.csproj 文件中添加如下內容:
<ItemGroup>
<None Include="bond/**">
<Pack>true</Pack>
<PackagePath>build/bond/</PackagePath>
</None>
</ItemGroup>
這假定 your.bond 文件位於bond\
子目錄中。
要自動向BondImportPath
添加內容,您需要添加一個 package.props 文件,該文件將由消費者自動導入。 .props with the following content:創建一個名為 .props
的文件,其內容如下:
<Project>
<ItemGroup>
<BondImportDirectory Include="$(MSBuildThisFileDirectory)bond" />
</ItemGroup>
</Project>
this.props 文件也需要打包。 將此添加到項目的 .csproj 文件中:
<ItemGroup>
<None Include="ExactNameOfPackage.props">
<Pack>true</Pack>
<PackagePath>build/</PackagePath>
</None>
</ItemGroup>
現在,消費者可以只使用PackageReference
。 他們項目中的任何.bond 文件都會被自動編譯,他們可以使用import "you-file.bond"
來引用 package 中的.bond 文件。
構建資產不會傳遞。 NuGet 5+ buildTransitive 功能看起來可以解決這個問題,但我還沒有嘗試過。
這是我使用的完整項目文件。 完整的代碼在我的 GitHub 存儲庫export-bond-file-nuget中。
lib-with-bond.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<PackageId>LibWithBond</PackageId>
<Version>1.2.0</Version>
</PropertyGroup>
<ItemGroup>
<None Include="LibWithBond.props">
<Pack>true</Pack>
<PackagePath>build/</PackagePath>
</None>
<None Include="bond/**">
<Pack>true</Pack>
<PackagePath>build/bond/</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Bond.CSharp" Version="[9.0.3]">
<PrivateAssets>contentfiles;analyzers</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
LibWithBond.props
<Project>
<ItemGroup>
<BondImportDirectory Include="$(MSBuildThisFileDirectory)bond" />
</ItemGroup>
</Project>
消費-lib.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<!-- I had a local NuGet source pointing to the output of running
`dotnet pack` on lib-with-bond.csproj -->
<PackageReference Include="LibWithBond" Version="1.2.0" />
</ItemGroup>
</Project>
我能夠為PackageReference
完成這項工作。 我最初的使它適用於ProjectReference
的實驗沒有成功,我沒有時間在這個答案上做更多的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.