仅用于内容文件的Nuget包

时间:2018-08-31 07:42:34

标签: c# .net nuget .net-standard

我正在尝试创建内容文件(没有托管程序集)的.NET标准nuget包,以供.NET Framework程序集使用。我的目的是使该文件文件夹输出到使用程序集的bin文件夹中。

这个问题类似于Add native files from NuGet package to project output directory(并使用此nuget软件包http://www.nuget.org/packages/Baseclass.Contrib.Nuget.Output/),但我要求我的nuget软件包为.NET Standard

我已将文件添加到程序集中的contentfiles \ any \ any \ myfiles下,并将以下内容添加到nuspec文件的元数据部分:

SELECT FROM (
     TRAVERSE out('Child') FROM #21:0
)

当我尝试将其添加到.NET Framework程序集时,出现错误

<contentFiles>
    <files include="any/any/myfiles/*" buildAction="None" copyToOutput="true" />
</contentFiles>

我还尝试将文件添加到项目的根目录,并在nuspec文件的元数据元素下面添加以下内容:

Could not install package 'myPackage 1.0.0'. You are trying to install this package into a project that targets '.NETFramework,Version=v4.6.2', but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.

完整的nuspec文件:

<files>
<file src="myfiles\**\*" target="myfiles" />

此外,在csproj中,我还将TargetFramework元素更改为

<?xml version="1.0"?>
<package>
<metadata>
    <id>myPackage</id>
    <version>1.0.0</version>
    <title>myPackage</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>my files/description>
    <releaseNotes></releaseNotes>
    <tags></tags>
    <contentFiles>
       <files include="any/any/myfiles/*" buildAction="None" copyToOutput="true" />
    </contentFiles>
</metadata>
<files>
   <file src="myfiles\**\*" target="myfiles" />
</files>
</package>

解决方案:

最后这就是解决方案。 “ myFiles”是一个位于项目根目录中的文件夹,其中包含许多不同的文件和子目录。

nuspec文件:

  <TargetFrameworks>netstandard1.3;netstandard2.0;net40;net45;net46</TargetFrameworks>

引用nuget包的项目将似乎有一个名为“ myfiles”的文件夹(所有文件上带有链接图标),该文件夹将在构建时复制到bin文件夹中。

1 个答案:

答案 0 :(得分:1)

有一些推断的方法可以执行此操作,但是add可以在此处将targetFramework添加为依赖项设置。

<dependencies>
  <group targetFramework=".NETStandard1.3" />
  <group targetFramework=".NETStandard2.0" />
  <group targetFramework=".NETFramework4.0" />
  <group targetFramework=".NETFramework4.5" />
  <group targetFramework=".NETFramework4.6" />
  <group targetFramework=".NETFramework4.6.2" />
</dependencies>

我还建议您在nuspec文件的files部分中将.dll文件与您的内容文件明确分开,并引用lib\<targetName>\约定。(实际上与我上面提到的推断观点有关,但目前我没有太多细节可提供)

因此您的nuspec文件将如下所示:

<?xml version="1.0"?>
<package>
<metadata>
    <id>myPackage</id>
    <version>1.0.0</version>
    <title>myPackage</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>my files/description>
    <releaseNotes></releaseNotes>
    <tags></tags>
    <contentFiles>
       <files include="any/netstandard1.3/myfiles/*" buildAction="None" copyToOutput="true" />
       <files include="any/netstandard2.0/myfiles/*" buildAction="None" copyToOutput="true" />
       <files include="any/net40/myfiles/*" buildAction="None" copyToOutput="true" />
       <files include="any/net45/myfiles/*" buildAction="None" copyToOutput="true" />
       <files include="any/net46/myfiles/*" buildAction="None" copyToOutput="true" />           
       <files include="any/net462/myfiles/*" buildAction="None" copyToOutput="true" />
    </contentFiles>
    <dependencies>
        <group targetFramework=".NETStandard1.3" />
        <group targetFramework=".NETStandard2.0" />
        <group targetFramework=".NETFramework4.0" />
        <group targetFramework=".NETFramework4.5" />
        <group targetFramework=".NETFramework4.6" />
        <group targetFramework=".NETFramework4.6.2" />
    </dependencies>
</metadata>
<files>
   <file src="<your-path>\<yourprojectassembly.dll>" target="lib\netstandard1.3\<yourprojectassembly.dll>" />
   <file src="<your-path>\<yourprojectassembly.dll>" target="lib\netstandard2.0\<yourprojectassembly.dll>" />
   <file src="<your-path>\<yourprojectassembly.dll>" target="lib\net40\<yourprojectassembly.dll>" />
   <file src="<your-path>\<yourprojectassembly.dll>" target="lib\net45\<yourprojectassembly.dll>" />
   <file src="<your-path>\<yourprojectassembly.dll>" target="lib\net46\<yourprojectassembly.dll>" />
   <file src="<your-path>\<yourprojectassembly.dll>" target="lib\net462\<yourprojectassembly.dll>" />
   <file src="<your-path>\myfiles\*" target="content\myfiles" />
   <file src="<your-path>\myfiles\*" target="contentFiles\any\netstandard1.3\myfiles" />
   <file src="<your-path>\myfiles\*" target="contentFiles\any\netstandard2.0\myfiles" />
   <file src="<your-path>\myfiles\*" target="contentFiles\any\net40\myfiles" />
   <file src="<your-path>\myfiles\*" target="contentFiles\any\net45\myfiles" />
   <file src="<your-path>\myfiles\*" target="contentFiles\any\net46\myfiles" />
   <file src="<your-path>\myfiles\*" target="contentFiles\any\net462\myfiles" />
</files>
</package>

截取您的nuget包的项目的外观截图。 (我的内容是文本文件,目标是"lib\<target>\any"

enter image description here


值得注意的是,虽然程序集中引用了您的程序包的内容可能有一些行为方面的考虑。

enter image description here

在上图中,来自nuget包的内容默认情况下称为“无复制到输出”,而C#编译称为BuildAction。