使用我的NuGet包编译项目的.bond文件



我有一个带有.bond文件的NuGet包。我的包的用户可以从我的包的。Bond文件中的结构中派生出他们的Bond结构。

我希望用户的Bond文件在包含我的NuGet包时被编译。今天他们必须包括我的NuGet和Bond。CSharp NuGet。但是,我的NuGet已经有一个Bond.CSharp的引用。

我如何编写我的包,使消费者不需要拥有自己的<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>

我假设您正在将基结构编译成包中的程序集。绑定代码假定生成的代码和运行时库完全匹配,因此我在PackageReference中使用了一个精确匹配的版本绑定:[9.0.3]

您说过您希望您的消费者能够从您的Bond结构中派生,因此您可能还希望配置它们的BondImportPath以将. Bond文件包含在您的包中。为此,您需要

  1. 确保.bond文件包含在包和
  2. 添加一个包。props文件,将BondImportPath设置到包目录中。bond文件。

确保.bond文件包含在包中,在包的.csproj文件中添加如下内容:

<ItemGroup>
<None Include="bond/**">
<Pack>true</Pack>
<PackagePath>build/bond/</PackagePath>
</None>
</ItemGroup>

假设.bond文件位于bond子目录中。

要自动向BondImportPath添加内容,您需要添加一个包。props文件,该文件将由消费者自动导入。创建一个名为ExactNameOfPackage.props的文件,内容如下:

<Project>
<ItemGroup>
<BondImportDirectory Include="$(MSBuildThisFileDirectory)bond" />
</ItemGroup>
</Project>

这个.props文件也需要打包。将此添加到项目的.csproj文件中:

<ItemGroup>
<None Include="ExactNameOfPackage.props">
<Pack>true</Pack>
<PackagePath>build/</PackagePath>
</None>
</ItemGroup>

现在,消费者可以只使用PackageReference。项目中的任何.bond文件都将被自动编译,他们可以使用import "you-file.bond"来引用包中的.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>

consume-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上工作并不成功,我没有时间来研究这个答案。

最新更新