将内容文件打包成nuget

时间:2018-06-08 14:09:05

标签: nuget appveyor

我正在使用AppVeyor构建一个.net核心项目,并发布一个nuget包作为结果。我有一个指定的内容文件:

  <ItemGroup>
    <Content Include="ExchangeScripts\getMarket.js">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <CopyToPublishDirectory>Always</CopyToPublishDirectory>
    </Content>
  </ItemGroup>

我希望它进入一个软件包,但是当我最终在应用程序中引用一个nuget软件包(来自AppVeyor的内部存储)时,我得到“找不到文件异常”。

是否有任何额外的步骤可以让我失踪?

1 个答案:

答案 0 :(得分:0)

确认包中包含内容文件

如果不确定nuget软件包中是否包含内容文件,则可以通过打开.nupkg软件包文件并尝试找到要包含的内容文件来快速确认。根据{{​​3}}:

  

从技术上讲,NuGet软件包只是一个ZIP文件,   使用.nupkg扩展名重命名并且其内容与特定内容匹配   惯例。

由于您已将文件的构建操作设置为Content(如上所示),因此您应该期望可以在contentcontentFiles目录中找到该文件。 (供以后参考,您可能会有点了解nuget包的内部结构/约定很有用。)

一旦您确认内容文件已包含在软件包中,那么看来您只需要弄清楚如何访问该文件的内容即可。

选项1:从另一个项目中的Nuget包访问内容文件

如果您希望能够引用另一个项目中的Nuget包中包含的内容文件,则首先将Nuget包引用添加到新项目中。完成此操作后,您应该看到包中包含的内容文件出现在引用项目中。此时,您现在可以像往常一样设置生成操作复制到输出目录选项,就像您已将这些文件直接添加到引用项目一样。

以下是使用Visual Studio 2017完成此操作的示例:

documentation

在上面的示例中,TestLib是一个.net core 2.0类库,仅包含具有2个文件的目录。每个都有一个Build Action的一个Content和一个与其名称相对应的Copy to Output Directory值。 nuget包是从TestLib创建的,随后被ConsoleApp项目引用。添加包引用后,Content项目中的TestLib目录(及其所有文件)将自动显示在ConsoleApp项目中。但是,默认情况下,所有内容文件的Copy to Output Directory选项都将设置为“不复制”,因此您可能希望根据上面的项目文件片段来更改此设置。

但是,如果您的要求不允许您更改引用项目中内容文件上的Copy to Output Directory选项,并且希望将其默认设置为Always而不是Never,然后我将向您介绍console project and class library project,以了解如何实现这一目标。 (提示:如果尚未使用.nuspec文件,则可以从.nupkg文件中复制自动生成的文件,以用作起点。)

[不太可能]选项2:直接从Nuget包访问内容文件

如果您想直接从Nuget包中访问内容文件,则可以自动执行从.nupkg文件中提取内容文件并根据需要进行处理的过程。我认为这不是您想要的,但我想有人曾经想要这样做。

即使这没有给您您所要的答案,我也希望这有所帮助。