Установите файлы содержимого в "копировать локально: всегда" в пакете nuget



я создаю пакет nuget из проекта с помощью этой команды в событии после сборки. переменная %conf% устанавливается в правильную конфигурацию (отладка или выпуск) и %1 - это имя проекта (например, " MyCompany.Мой проект").



nuget pack -Prop Configuration=%conf% "%1.csproj" -exclude *.sql -IncludeReferencedProjects


этот пакет предназначен только для нашего собственного использования, он никогда не будет опубликован на nuget. Он заканчивается в нашем частном хранилище.



в проекте есть файл, который имеет значение generate action : content и copy local : always. (Моя visual studio на французском языке, так что я не на 100% уверен в предательстве). Давайте назовем его importantfile.xml.



в сгенерированном пакете я получаю следующую структуру:



- content
- importantfile.xml
- lib
-net45 (.NetFramework,Version=v4.5)
-MyCompany.MyProject.dll


это хорошо, я хочу!--7--> для развертывания в пакете, потому что, ну, этот файл важен!



когда я устанавливаю пакет в другой проект,importantfile.xml развертывается в корне проекта. Все нормально. Но он не установлен в copy local : always.



мне нужно importantfile.xml на copy local : always в этом проект, где я устанавливаю свой пакет.



как я могу этого достичь?



Примечания :



я можете set copy local : always в файле сразу после установки пакета, это не имеет большого значения. Я бы жил с этим, если бы более поздние обновления пакета позволили бы этому свойству как есть, что не так. При обновлении пакета, copy local сбрасывается в never (как указано здесь).



в папке проекта есть файл nuspec, вот он:



<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<copyright>Copyright 2014</copyright>
<tags>some random tags</tags>
</metadata>
</package>
749   5  

5 ответов:

вы можете использовать PowerShell и Install.ps1 крюк, предоставленный NuGet.

посмотреть документация.

через PowerShell вы должны "искать" для элемента контента, который включает в себя ваш importantfile.xml в атрибут. Когда скрипт нашел его, он должен добавить <CopyToOutputDirectory>Always</CopyToOutputDirectory> как дочерний элемент.

    <Content Include="importantfile.xml">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>

вы можете найти некоторые фрагменты PowerShell здесь. Просто взгляните на .ps1 файлы.

вы можете попробовать следование (не проверено). Файл должен быть назван Install.ps1 и скопировать в :

param($installPath, $toolsPath, $package, $project)

# Load project XML.
$doc = New-Object System.Xml.XmlDocument
$doc.Load($project.FullName)
$namespace = 'http://schemas.microsoft.com/developer/msbuild/2003'

# Find the node containing the file. The tag "Content" may be replace by "None" depending of the case, check your .csproj file.
$xmlNode = Select-Xml "//msb:Project/msb:ItemGroup/msb:Content[@Include='importantfile.xml']" $doc -Namespace @{msb = $namespace}


#check if the node exists.
if($xmlNode -ne $null)
{
    $nodeName = "CopyToOutputDirectory"

    #Check if the property already exists, just in case.
    $property = $xmlNode.Node.SelectSingleNode($nodeName)
    if($property -eq $null)
    {
        $property = $doc.CreateElement($nodeName, $namespace)
        $property.AppendChild($doc.CreateTextNode("Always"))
        $xmlNode.Node.AppendChild($property)

        # Save changes.
        $doc.Save($project.FullName)
    }
}

вы также должны проверить, если все удаляется полностью при удалении пакета.

Примечание Jonhhy5

при обновлении пакета через update-package, Visual Studio предупреждает, что проект изменяется "вне среды". Это вызвано $doc.Save($project.FullName). Если я нажму перезагрузить до команда полностью прекращено, это иногда вызывает ошибки. Хитрость заключается в том, чтобы оставить диалог там до завершения процесса, и затем перезагрузить проектов.

вместо использования сценария PowerShell другой подход заключается в использовании MSBuild цели или реквизит файл С тем же именем, что и идентификатор пакета:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="$(MSBuildThisFileDirectory)importantfile.xml">
      <Link>importantfile.xml</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

в файл nuspec затем, вместо того, чтобы добавлять необходимые файлы

Я знаю, что вы, ребята, получили рабочее решение для этого, но это не сработало для меня, поэтому я собираюсь поделиться тем, что я вытащил из NLog.config NuGet package install. ps1 (GitHub source здесь).

Примечание: это не мой код, это содержимое install. ps1 от NLog.конфигурационный пакет nuget просто делится знаниями.

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

вы можете найти принятые значения int для BuildAction здесь и принятые значения для CopyToOutputDirectory здесь.

param($installPath, $toolsPath, $package, $project)

$configItem = $project.ProjectItems.Item("NLog.config")

# set 'Copy To Output Directory' to 'Copy if newer'
$copyToOutput = $configItem.Properties.Item("CopyToOutputDirectory")

# Copy Always Always copyToOutput.Value = 1
# Copy if Newer copyToOutput.Value = 2  
$copyToOutput.Value = 2

# set 'Build Action' to 'Content'
$buildAction = $configItem.Properties.Item("BuildAction")
$buildAction.Value = 2

Я сделал это, который копирует файлы из моей папки сборки в папку вывода (bin/debug или bin/release). Работает как шарм для меня.

файл Nuspec:

<package>
  <files>
    <file src="\bin\Release\*.dll" target="lib" />
    <file src="\bin\Release\x64\*.dll" target="build\x64" />
    <file src="\bin\Release\x86\*.dll" target="build\x86" />
    <file src="MyProject.targets" target="build\" />    
  </files>
</package>

MyProject.цели

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

я написал небольшой инструмент под названием NuGetLib для автоматического добавления файлов в пакет nuget после сборки.

  1. создать tools папка с вашими Install.ps1 скрипт
  2. построить свой nugetPackage
  3. добавьте папку tools в встроенный nugetPackage

https://stackoverflow.com/a/47134733/6229375

Comments

    Ничего не найдено.