Пакет Nuget только для файлов содержимого - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь создать стандартный пакет содержимого Nuget для файлов .NET (без управляемых сборок), который будет использоваться сборками .NET Framework. Моя цель - вывести эту папку с файлами в папку bin потребляющей сборки.

Этот вопрос похож на Добавить собственные файлы из пакета NuGet в выходную директорию проекта (и использует этот пакет nuget http://www.nuget.org/packages/Baseclass.Contrib.Nuget.Output/),, но мне требуется, чтобы мой пакет nuget был .NET Standard

Я добавил файлы в сборку в разделе contentfiles \ any \ any \ myfiles и добавил следующее в раздел метаданных файла nuspec:

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

Когда я пытаюсь добавить это в сборку .NET Framework, я получаю сообщение об ошибке

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" />

Полный файл 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/any/myfiles/*" buildAction="None" copyToOutput="true" />
    </contentFiles>
</metadata>
<files>
   <file src="myfiles\**\*" target="myfiles" />
</files>
</package>

Кроме того, в csproj я также изменил элемент TargetFramework на

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

РЕШЕНИЕ:

В конце концов, это решение. «myFiles» - это папка, которая находится в корне проекта и содержит множество различных файлов и подкаталогов.

файл nuspec:

<?xml version="1.0"?>
<package >
  <metadata>
   <id>myPackage</id>
    <version>1.0.0</version>
    <title>My Package</title>
    <tags></tags>
     <dependencies>
         <group targetFramework=".NETStandard2.0" />
         <group targetFramework=".NETFramework4.6.2" />
    </dependencies>
    <contentFiles>
       <!-- this sets "CopyIfNewer" on all files in the project that references this package -->
      <files include="**/*" buildAction="None" copyToOutput="true"/>
    </contentFiles>
  </metadata>
    <files>
        <file src="myFiles\**\*" target="contentFiles\any\any\myFiles"/>
     </files>
  </package>

Похоже, что в проекте, который ссылается на пакет nuget, есть папка с именем "myfiles" (со значком ссылки на все файлы), которая будет скопирована в папку bin при сборке.

1 Ответ

0 голосов
/ 31 августа 2018

Есть несколько предполагаемых способов сделать это, но 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>

Я бы также рекомендовал явно отделить файлы .dll от ваших файлов содержимого в разделе файлов файла nuspec и сослаться на соглашение 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, по умолчанию упоминается как No Copy to Output и C # Compile как BuildAction.

...