Как запретить пакету NuGet включать нежелательные файлы

Я создаю пакет NuGet с иерархией папок, которая выглядит следующим образом:

ProjectDir
    Infrastructure
        class1.cs
        class2.cs
    Task
        class3.cs
        class3.cs
    StuffToInclude
        SampleCode
            sampleclass1.cs.pp
            sampleclass2.cs.pp
        Images
            image1.gif
            image2.gif
        Doc
            text1.txt
            text2.txt
    Project.nuspec

Обратите внимание, что файл nuspec создается просто с помощью команды «nuget spec», а затем добавляется следующий раздел файла:

<files>
    <file src="StuffToInclude\**\*.*" target="content" />
</files>

Я ожидаю (и хочу), чтобы в пакете была папка с содержимым, которая выглядит так:

content
    SampleCode
        sampleclass1.cs.pp
        sampleclass2.cs.pp
    Images
        image1.gif
        image2.gif
    Doc
        text1.txt
        text2.txt

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

content
    StuffToInclude
        Images
            image1.gif
            image2.gif
        Doc
            text1.txt
            text2.txt
    SampleCode
        sampleclass1.cs.pp
        sampleclass2.cs.pp
    Images
        image1.gif
        image2.gif
    Doc
        text1.txt
        text2.txt

Обратите внимание, что в нежелательной папке StuffToInclude нет подпапки SampleCode — каким-то образом упаковщик nuget понял, что файлы «.pp» не должны помещаться в содержимое, если это явно не запрошено. Но все эти другие файлы (во всех других папках) дублируются без необходимости, и их наличие там нежелательно, потому что, когда пакет потребляется, эта папка также дублируется в целевом проекте.

Я подумал, что, возможно, что-то вроде этого в nuspec поможет:

<files>
    <file src="StuffToInclude\**\*.*" target="content" exclude="StuffToInclude\**\*.*"/>
</files>

но все варианты, которые я пробовал для атрибута «исключить», похоже, не помогают.

Как исключить файл «StuffToInclude» из папки содержимого?

Большое спасибо.


person Stephan G    schedule 09.07.2019    source источник
comment
Я последовал твоим шагам и получил то, что ты хочешь. Так что я думаю, может быть, вы ошиблись при упаковке, не могли бы вы поделиться большим содержанием .nuspec? (Удаление личных данных, таких как id, author...) И используете ли вы команды nuget spec и nuget pack xx.xxspec? Если нет, поделитесь реальной командой, которую вы используете.   -  person LoLance    schedule 11.07.2019


Ответы (1)


Как запретить пакету NuGet включать нежелательные файлы

Я предполагаю, что команда, которую вы используете при создании пакета, похожа на nuget pack xx.csproj.

Если да, то по какой особой причине вы создали пакет на основе файла проекта после создания файла .nuspec?

Согласно этому документу, мы можем использовать команду nuget pack на основе указанного .nuspec or project file.

Поэтому обычно, если мы создаем пакет на основе .csproj, нет необходимости создавать файл .nuspec. Кроме того, если мы хотим создать пакет на основе .nuspec, я предлагаю использовать команду nuget pack xx.nuspec вместо nuget pack xx.csproj.

Причина проблемы:

Я провел несколько тестов и обнаружил, что когда мы помещаем файл Project.nuspec в каталог проекта и используем команду типа nuget pack xx.csproj, тогда nuget.exe будет считывать данные из обоих xx.nuspec and xx.csproj, поэтому у вас есть вторая копия .

1# Структура для nuget pack xx.csproj, если нет xx.nuspec в том же каталоге:

content
    StuffToInclude
        Images
            image1.gif
            image2.gif
        Doc
            text1.txt
            text2.txt

2# Структура для nuget pack xx.nuspec:

content
    SampleCode
        sampleclass1.cs.pp
        sampleclass2.cs.pp
    Images
        image1.gif
        image2.gif
    Doc
        text1.txt
        text2.txt

И когда вы используете команду nuget pack на основе файла проекта (.csproj), в котором существует ProjectName.nuspec, она считывает данные как из .csproj, так и из .nuspec. так что получается вторая копия, как у вас.

Чтобы решить эту проблему:

  1. Сохраните файл xx.nuspec и используйте команду типа nuget pack xx.nuspec (рекомендуется)

  2. Удалите файл xx.nuspec (или удалите <Files> section) и используйте команду типа nuget pack xx.csproj, чтобы включить эти файлы xx.cs.pp в папку содержимого, вам может потребоваться установить их build action в content.

  3. Храните и файл xx.nuspec, и файл xx.csproj (см. ниже), и все, что вы хотите, в файле xx.nuspec, но чтобы избежать нежелательных вторых копий вещей, убедитесь, что каждый элемент, который вы не хотите копировать, дважды установлено значение Build Action из None.

person LoLance    schedule 11.07.2019
comment
Спасибо, Ланс. Я играл с обеими вашими идеями для решения, и ни одна из них не идеальна. Я специально создал файл NuSpec, чтобы я мог перечислить зависимости фреймворка, файлы и т. д. Однако, когда он был сгенерирован, он имеет отличную возможность ссылаться на переменные параметры (например, заголовок $id$ и т. д.), которые поступают из MSBuild, но только если пакет соответствует файлу проекта, а не файлу nuspec. Таким образом, кажется, что было много мыслей, которые ушли на то, чтобы сделать весь этот процесс очень удобным, но, похоже, из-за этой проблемы осталась дыра. Любые другие идеи? - person Stephan G; 12.07.2019
comment
Дальнейшие испытания вашего решения № 2... кажется, что единственный способ сделать это - загрязнить иерархию каталогов исходного проекта фактическим содержимым, которое вы хотите скопировать в целевой потребляющий проект через NuGet. Итак, я думаю, что подтвердил, что это теоретически возможно, но определенно довольно уродливо и сложно в обслуживании. - person Stephan G; 12.07.2019
comment
Лэнс. Благодаря вашей работе у меня появилась возможность решить эту проблему. Я отредактировал ваше решение, включив в него новую резолюцию № 3: Храните и файл xx.nuspec, и файл xx.csproj (см. ниже), и все, что вы хотите, в xx. .nuspec, но чтобы избежать нежелательных вторых копий вещей, убедитесь, что для каждого отдельного элемента, который вы не хотите копировать дважды, установлено значение «Нет». Моя благодарность вам. - person Stephan G; 12.07.2019