Установите файлы содержимого в "копировать локально: всегда" в пакете 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>
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 после сборки.
- создать
toolsпапка с вашимиInstall.ps1скрипт- построить свой
nugetPackage- добавьте папку tools в встроенный
nugetPackage
Comments