簡體   English   中英

使用我的 NuGet package 項目的 Compile.bond 文件

[英]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 的構建目標運行的。

默認情況下,您使用的包的構建目標不會流向您的消費者。 PackageReferencePrivateAssets的默認值為"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 中。 為此,您需要

  1. 確保.bond 文件包含在 package 和
  2. 添加一個 package.props 文件以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM