Как упаковать один EXE-файл с помощью NuGet

У меня есть большой EXE-файл, который нужен моему проекту, но я не хочу коммитить большие EXE-файлы в Git. Итак, мне кажется жизнеспособным вариантом вытащить его через NuGet. Достаточно просто, я создал файл .nuspec с моим единственным EXE-файлом:

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
        <id>Traefik</id>
        <version>1.5.1</version>
        <authors>Containous</authors>
        <owners>MikeC</owners>
        <projectUrl>https://github.com/containous/traefik</projectUrl>
        <license type="expression">MIT</license>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Traefik binaries</description>
        <copyright>Copyright ©2020 Containous</copyright>
    </metadata>

    <files>
        <file src="traefik.exe" target="lib" />
    </files>
</package>

Затем я запускаю nuget pack и создаю файл .nupkg. Все правильно:

введите здесь описание изображения

Однако, когда я пытаюсь сослаться на свой пакет NuGet в своем проекте, я получаю следующую ошибку прямо при нажатии кнопки «Установить»:

Severity    Code    Description Project File    Line    Suppression State
Error       Could not install package 'Traefik 1.5.1'. You are trying to install this package into a project that targets 'Unsupported,Version=v0.0', 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.              

Это пакет NuGet, в котором нет сборок и не на что ссылаться. Это просто контент, который я хочу извлечь и скопировать куда-нибудь с помощью действия после сборки. Можно ли создать пакет NuGet, в котором нет ссылок на сборки и который содержит только содержимое (в данном случае — один EXE-файл)? Если да, то как правильно разместить это в файловой структуре? Я пытался поместить EXE в несколько мест, таких как корзина, инструменты, контент и т. Д. Та же ошибка, несмотря ни на что. Спасибо!


person Mike Christensen    schedule 09.07.2020    source источник
comment
Папка lib предназначена для ссылочных сборок. Если вы не хотите, чтобы ваш исполняемый файл добавлялся в качестве ссылки, вам нужно tools. Вам также необходимо установить для флага зависимости разработки значение true. github.com/obfuscar/obfuscar/blob/master/Obfuscar.nuspec   -  person Lex Li    schedule 09.07.2020


Ответы (1)


Папка lib для этого не подходит, так как она используется для сборок, на которые ваш проект ссылается при установке пакета. Кроме того, структура папок должна содержать подходящую целевую платформу папка типа net472. Вы не можете размещать сборки непосредственно под lib.

<file src="traefik.exe" target="lib/net472"/>

Если вы хотите рассматривать свой исполняемый файл как файл с чистым содержимым, вы можете использовать contentFiles.

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
        <id>Traefik</id>
        <version>1.5.1</version>
        <authors>Containous</authors>
        <owners>MikeC</owners>
        <projectUrl>https://github.com/containous/traefik</projectUrl>
        <license type="expression">MIT</license>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Traefik binaries</description>
        <copyright>Copyright ©2020 Containous</copyright>
        <contentFiles>
            <files include="any/any/traefik.exe" buildAction="None" copyToOutput="true"/>
        </contentFiles>
    </metadata>
    <files>
        <file src="traefik.exe" target="contentFiles/any/any/traefik.exe"/>
        <file src="traefik.exe" target="content/traefik.exe"/>
    </files>
</package>

Таким образом, traefik.exe будет скопирован непосредственно в вашу выходную папку. Внутри вашего пакета структура папок будет такой. Эта структура папок предопределена для файлов содержимого.

content
    - traefik.exe
contentFiles
    - any
        - any
            - traefik.exe

С помощью этого подхода вы даже можете настроить таргетинг на отдельные или несколько фреймворков. Допустим, у вас есть специальный исполняемый файл для .NET Framework 4.7.2, затем адаптируйте второй any к вашему прозвище целевой платформы, здесь net472. Затем исполняемый файл будет скопирован в выходную папку только в том случае, если фреймворк соответствует фреймворку вашего проекта.

<files include="any/net472/traefik.exe" buildAction="None" copyToOutput="true" flatten="true"/>
<file src="traefik.exe" target="contentFiles/any/net472/traefik.exe"/>

Конечно, вы можете определить несколько исполняемых файлов для разных фреймворков, подобных этому. Несколько замечаний по поводу файла NuSpec. Исполняемый файл также копируется в папку content вашего пакета для обратной совместимости, поскольку contentFiles поддерживается только начиная с NuGet 4.0 с использованием PackageReference.

person thatguy    schedule 09.07.2020