I generate a nuget package from a project with this command in the post-build event. the variable %conf%
is set to the right configuration (debug or release) and %1
is the project name (e.g. "MyCompany.MyProject").
nuget pack -Prop Configuration=%conf% "%1.csproj" -exclude *.sql -IncludeReferencedProjects
This package is for our own usage only, it will never be published on nuget. It ends in our private repository.
In the project, there is a file that is set to generate action : content
and copy local : always
. (My visual studio is in french, so I'm not 100% sure of the traduction). Let's name it importantfile.xml
.
In the generated package, I end up with this structure :
- content
- importantfile.xml
- lib
-net45 (.NetFramework,Version=v4.5)
-MyCompany.MyProject.dll
Which is fine, I want importantfile.xml
to be deployed in the package, because, well, this file is important!
When I install the package in another project, importantfile.xml
is deployed at the root of the project. That's OK. But it is not set to copy local : always
.
I need importantfile.xml
to be copy local : always
in this project where I install my package.
How can I achieve that?
Notes :
I can set copy local : always
on the file just after installing the package, that's no big deal. I would live with it if later updates of the package would let this property as-is, wich is not the case. When updating the package, copy local
is resetted to never
(as stated here).
There's a nuspec file in the project's folder, here it is :
<?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>
I have made this which copies files from my build folder to the output folder (bin/debug or bin/release). Works like a charm for me.
Nuspec file:
MyProject.targets
You can use PowerShell and the
Install.ps1
hook provided by NuGet.See the documentation.
Via PowerShell you have to 'search' for the content element which includes your
importantfile.xml
in an attribute. When the script found it, it has to add<CopyToOutputDirectory>Always</CopyToOutputDirectory>
as a child element.You can find some PowerShell snippets here. Just take a look at the
.ps1
files.You could try the following (not tested). The file has to be named
Install.ps1
and copied into thetools
folder:You should also check if everything is removed completely when uninstalling the package.
Note by Jonhhy5
When updating the package via
update-package
, Visual Studio warns that the project is modified "outside the environnment". That's caused by$doc.Save($project.FullName)
. If I click reload before the command is fully terminated, it sometimes causes errors. The trick is to leave the dialog there until the process finishes, and then reload the projects.I have written a little tool called
NuGetLib
to automatically add files to the nuget package after build.tools
folder with yourInstall.ps1
scriptnugetPackage
nugetPackage
https://stackoverflow.com/a/47134733/6229375
Instead of using a PowerShell script another approach is to use an MSBuild targets or props file with the same name as the package id:
In the nuspec file then, instead of adding the required files to the
Content
directory, add them to theBuild
directory along with the targets file.If you require different content for different architectures then you can add architecture folders under
Build
also each with their own targets file.Benefits to using a targets file over the PowerShell script with NuGet
Content
directory:I know you guys got a working solution to this but it didn't work for me so I'm going to share what I pulled out of the NLog.config NuGet package install.ps1 (github source here).
It seems a little more straight forward to me and just hoping to help others that will likely stumble upon this.
You can find the accepted int values for BuildAction here and the accepted values for CopyToOutputDirectory here.
if the link breaks again
Fields prjBuildActionCompile 1
The file is compiled.
prjBuildActionContent 2
The file is included in the Content project output group (see Deploying Applications, Services, and Components)
prjBuildActionEmbeddedResource 3
The file is included in the main generated assembly or in a satellite assembly as a resource.
prjBuildActionNone 0
No action is taken.