Nuspec buildAction не применяется к contentFiles

Недавно я пытался создать файл .nuspec, который прикрепляет файл .dll в качестве встроенного ресурса. Для этого я использовал тег contentFiles для metadata, установив buildAction="EmbeddedResource", как описано в разделе Пример раздела contentFiles на официальная документация.

Ниже вы можете увидеть содержимое моего файла .nuspec:

<package>
    <metadata>
        <id>MyPackage</id>
        <version>1.0.0.0</version>
        <title>MyPackage</title>
        <authors>Matias G Henschel</authors>
        <owners>Matias G Henschel</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>My package description</description>
        <copyright>2017</copyright>
        <contentFiles>
            <files include="myDllFile.dll" buildAction="EmbeddedResource" />
        </contentFiles>
    </metadata>
    <files>
        <file src="content\myDllFile.dll" target="contentFiles" />
    </files>
</package>

Этот пакет корректно копирует файл внутри целевого проекта, но не применяет к нему действие сборки, что для меня очень важно.

Я также безуспешно пытался использовать файл .targets.

Если вы хотите узнать больше, я также создал проблему на странице GitHub. .

PS: ИМХО, документация по файлам contentFiles и .targets требует некоторой доработки, они недостаточно ясны, а в .targets отсутствуют примеры.


person Matias G H    schedule 09.10.2017    source источник


Ответы (1)


Вам также нужна запись файла, чтобы фактически скопировать файл в правильную папку contentFiles:

<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    …
    <contentFiles>
      <files include="any/any/MyEmbeddedFile.txt" buildAction="EmbeddedResource" />
    </contentFiles>
  </metadata>
  <files>
    <file src="path/to/MyEmbeddedFile.txt" target="contentFiles/any/any/MyEmbeddedFile.txt" />
  </files>
</package>

Обратите внимание, что это будет работать только в NuGet 3.3+ для проектов на основе project.json и NuGet 4+ для проектов на основе PackageReference. Для проектов, использующих этот пакет через packages.config, вам все равно нужно будет добавить файл в папку content и добавить пользовательскую цель, чтобы сделать его правильным типом элемента.

person Martin Ullrich    schedule 09.10.2017
comment
Файл соответствует рекомендациям и не работает. Единственная деталь — это структура папок any/any, которую я пробовал безуспешно. Для справки: я использую Nuget 4.1. - person Matias G H; 09.10.2017
comment
просто чтобы было ясно, в какой проект вы это устанавливаете? встроенный ресурс не будет отображаться в обозревателе решений, вам нужно будет открыть exe/dll в dotPeek/ILSpy или sth. также обратите внимание, что вам необходимо очистить кеш NuGet, если вы не всегда увеличиваете номер версии при каждой попытке, используя dotnet nuget locals all --clear - person Martin Ullrich; 10.10.2017
comment
Я пытаюсь добавить его в библиотеку классов. Версия не проблема, ставлю вручную и у меня получается корректно установить пакет. Он просто не добавляет его правильно (встроенный ресурс). Я использовал ILSpy, чтобы проверить, был ли там файл, но ресурс не был прикреплен. Когда я вручную установил для него Embedded Resource, файл появился в ILSpy. - person Matias G H; 10.10.2017
comment
Использует ли потребляющий проект ProjectReference или packages.config? потому что contentFiles не работает с packages.config - person Martin Ullrich; 10.10.2017
comment
Он использует packages.config... Но как мне обойти это? Он должен работать так же, как и любой другой пакет NuGet... - person Matias G H; 10.10.2017
comment
Это не так. contentFiles только для ProjectReference или project.json. - person Martin Ullrich; 10.10.2017
comment
Если я не могу использовать contentFiles, что мне следует использовать? .targets файл? (не мог понять, как это сделать) Мне нужен только файл .dll в качестве встроенного ресурса. Это все. - person Matias G H; 10.10.2017