Как упаковать один EXE с помощью NuGet - PullRequest
0 голосов
/ 09 июля 2020

У меня есть большой EXE-файл, который нужен моему проекту, но я не хочу фиксировать большие EXE-файлы в Git. Так что, как мне кажется, жизнеспособный вариант - вытащить его через NuGet. Достаточно просто, я создал файл .nuspe c со своим единственным 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 в нескольких местах, таких как «корзина», «инструменты», «содержимое» и т. Д. c. Та же ошибка, несмотря ни на что. Спасибо!

1 Ответ

1 голос
/ 09 июля 2020

Папка 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"/>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...