Putting files in "analyzer" dir in nupkg using new csproj format - nuget

I'm using new .csproj file format to pack NuGet package without using .nuspec file.
The problem is, it puts my dll in \lib\ where I need to put it \analyzers\
Who I do accomplish that?

The property that controls where the build output is placed is called BuildOutputTargetFolder which is defaulted to lib (or tools when IsTool is set to true):
<BuildOutputTargetFolder>analyzers</BuildOutputTargetFolder>

Related

Should we need to pass NugetFile path with msbuild /t:pack ? Though NugetFile path already added to csproj file

I facing a problem while adding the reference for another project. It gives me an error for adding the Nuspec file not found in another project. To be clear I have project A (.netcore project) and I want to use project B(.net standard) as a reference. In project A I used NuspecFile path in csproj file and GeneratePackageOnBuild = False. I used this Nuspec file for packaging some .netcore c++ dll. When I used msbuild /t:pack projectA.csproj /p:Nuspecfile=Nuget/ProjectA.nuspec command I was getting an error for nuspec file not found in projectB. I added the nuspec file in Project B and I had to build Project B separately. If I remove the /p:Nuspecfile=Nuget/ProjectA.nuspec from msbuild /t:pack command. There is no issue.
My question is:
Should I have to add /p:Nuspecfile=Nuget/ProjectA.nuspec with msbuild /t:pack?
I already added in the projectA.csproj file.
Do we need to add NuspecFile in csproj and msbuild both or only one place?
What would be the problem If I don't use Nuspec file information in both( csproj and msbuild)?
As per Microsft guidelines, I used this command.
https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets#packing-using-a-nuspec-file
Packing using a .nuspec file
I removed the /p:Nuspecfile=Nuget/ProjectA.nuspec from the msbuild command and no error and I dont need to add any nuspec file in project B. I am not sure is it right approach or not.

Nesting files in Nuget package without PowerShell

The title says it all. I have files that I want to nest during the installation of a NuGet package but can't use PowerShell scripts since they won't be run any longer (see here).
Are there any other ways to achieve this goal?
UPDATE: By nested I mean like *.resx and *.Designer.cs or *.xaml and code-behind files *.xaml.cs. I know I can achieve that by adding a <DependentUpon> element in the *.csproj file but I don't know how I can add that element without using PowerShell.
UPDATE2: init.ps1 runs the first time a package is installed in a solution. That won't cut it though. I would need the script to run when the package is installed into a project just like install.ps1 was run up to NuGet3.
UPDATE3: What I want to do is to add 3 files into the Properties folder of the target projects (Resources.resx, Resources.tt and Resources.Designer.cs). They are a replacement for the usual resources implementation. These files are installed by the nuget package when it is added to the project.
This is the part of the *.nuspec file that adds them to the Content folder of the package. As only one of them is actually content (the others being an Embedded Resource and Compile respectively) it would be nice to be able to set their build actions accordingly but one step at a time.
<files>
<file src="Properties\Resources.resx" target="content\Properties\Resources.resx" />
<file src="Properties\Resources.tt.pp" target="content\Properties\Resources.tt.pp" />
<file src="Properties\Resources.Designer.cs" target="content\Properties\Resources.Designer.cs" />
</files>
As these files are added to the projects I want the nesting inside the *.csproj file and not happen via a separate *.props file if that is somehow possible.
Packages can add MSBuild items like this to a project by using a .props file in the package. It would contain the same content that you would put into the .csproj file.
The down side of this is that the content cannot be modified by the user. If you need to modify the user's actual project file and copy content to the project folder you would have to include a .targets file in your package and set BeforeTargets="Build" on your target. This would give you a chance to run before build and make changes as needed.
The build folder works for both packages.config and PackageReference (NETCore SDK) projects. You can find more out about it here: https://learn.microsoft.com/en-us/nuget/create-packages/creating-a-package#including-msbuild-props-and-targets-in-a-package

Package all content from a folder using NuGet

We would like to use Octopus Deploy for our Deployments. I am trying to package our assemblies using Nuget for the same. We maintain lots of solutions (contains lots of independent projects) and We have our custom windows host which doesn't have any direct reference to the application assemblies. Currently We Zip all the files and extract them to install the windows services. I am exploring a way to package all the content in zip file to NuGet Package. is that possible. What is the best and easiest way to package considering our current implementation. I tried creating .NuSpec file and NuPkg manually using package explorer. But it's not visible and only visible in package explorer.
you can bundle all artifacts by defining metadata inside a nuspec files , nuget package created using that nuspec file will contain all artifacts defined in nuspec file, you can do the whole process from your command line as well , when creation of package is done from command line you can see your package in the same path where nuspec file resides and most important thing nuget package is also a type of zip file , so you can simply rename your example.nupkg to example.zip and verify the bundled contents.

How does NuGet decide which files are included when packing a csproj file?

I'm trying to use the simplest and most automated approach possible to create a few NuGet packages from some of our projects, by using the nuget pack [path-to-csproj] method.
For most of the projects I've tried this, the command line tool seems to understand the .Net framework version of the projects and it adds the output dll and xml files to the correct lib folder. In some other project, it is including a .css file to the content folder in the package, I assume because the file has a Content build action.
What exactly does this NuGet command include in the final package and how does it extract this information? Is there a comprehensive documentation on the file extraction from the csproj? I'd like to understand this process so that I can hopefully add my own files to it, like the app.config file and some code contracts assembly files without having to hardcode paths in the nuspec definition.

Is there a way to specify Build Action=None with nuspec?

My company has an assembly versioning package that I've written in powershell and is distributed amongst my colleagues via our internal nuget feed.
There are a couple of template files which can be user-modified after the package in installed. These files are being included in the package which we generate via
nuget pack xxxx.csproj
We've done a little investigation and there files are not packaged when we change the Build Action to None.
Is there a way to tell nuspec to add the files to the project with Build Action set to None*?
Alternatively is there a way to tell nuget pack to not include certain files in the package in generates?
NuGet pack has an Exclude parameter that can be used to filter out files that you don't want in your package.
If you want to include files that are auto excluded from your project then you need to add a nuspec to your project and add a element that includes that file.
More information here:
http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#From_a_project
http://docs.nuget.org/docs/reference/command-line-reference#Pack_Command
nuget pack will ignore any files or folders that start with period/full stop. So one easy way would be to rename your template files or the folder they are located in to start with a period/full stop if possible.