I've got 10+ Visual Studio solutions that are referencing a nuget package.
When I decide to update that package in every solution it's a very long work to open each solution manually, update its package and check-in all changes to TFS. I'd like to "automate" this process with a batch operation that does it on behalf of me.
I've made some experiments with nuget.exe by command line but it doesn't care about TFS read-only files: it overwrites the content of my files without checking-out them so this way seems not the best way to do it.
Any other suggestion to achieve the aim?
You can use nuget update command to do this. VS/TFS can detect the changes even thought you are running the command outside from VS. And usually, only "packages.config" file will be updated during the nuget package update.
Update:
Following is a simple code to find the solution files under the given path and update the nuget packages for the solution and then check in the pending changes via TFS PowerShell CommandLets (You need to install "TFS Power Tool" to use this commandlet). You can update according to your scenario.
param([String]$dirpath)
add-pssnapin Microsoft.TeamFoundation.PowerShell;
Get-ChildItem -Path $dirpath -Filter *.sln -Recurse | ForEach-Object { & nuget update $_.FullName 2>1; cd $_.Directory; get-tfspendingchange; new-tfschangeset}
Save the code as a powershell script and run it from Windows PowerShell with argument "-dirpath yoursolutionpath". It will run as following:
Download Nuget Comanline
nuget.exe restore YourSolution.sln
nuget.exe update YourSolution.sln
Nuget Docs
Related
I've tried with Nuget Update, Nuget restore, but they are actually not the same and here's why:
I've created a Nuget pkg only to distribute an executable file. When I install the Nuget the executable is added to my project so I can reference it and run it within my application.
Now, I don't want that every developer has to install the Nuget to have the executable in their project, but I just want the .exe to be added when the project is built. And of course, the reference to the package in the config file is present.
If I run Update-Package -Id -reinstall(using the Package Manager of VS) a folder with the .exe is added to the project root, but if I do nuget update or nuget restore (using the nuget CLI) it only re-add the .exe into the packages folder.
The reason why I need to run the nuget CLI is because I'm using TeamCity and I want to add the .exe when the automatic build runs.
I hope it makes sense.
How reproduce VS2017 Package Manager command “Update-Package -reinstall” with Nuget CLI
I am afraid you can NOT do such things with NuGet CLI. That because NuGet CLI does not modify a project file or packages.config. When we modify the project file, we need to do it by NuGet API in Visual Studio, but only package manager console can provide access to visual studio objects:
https://github.com/NuGet/Home/issues/1512
That is the reason why I said the easiest way is using the command line Update-Package -Id -reinstall in your previous thread. Then I also gave you another way to resolve this issue from the root cause, using .targets file to copy the executable file to the the project root, please check my update answer.
Of course, there is another simple idea to resolve this issue, just add a pre-build event in your project to copy the executable file to the the project root:
xcopy /Y "$(SolutionDir)packages\MyToolPackage.1.0.0\Tools\wkhtmltopdf.exe" "$(ProjectDir)"
Hope this helps.
I modified a solution and deleted one of the .csproj files and instead packaged the .dlls into a NuGet package. Then I added the package to the two other .csproj files that reference the .dlls. All was good - it builds locally, but I can't get it to build on the build server. When I look at the code gotten out of TFS for the build I see that the packages.config for both projects have the correct reference to the NuGet package, but when I open the solution in VS the references have little yellow exclamation marks next to them because they're broken references. The only way I can get it to build is to open the NuGet CMI and execute Uninstall-package package-name and the Install-Package package-name. Then the references are good. When I look in the packages.config of the main project it contains the correct reference to the Package. So I've given up on getting TFS to correctly grab the package, but since Install-Package and Uninstall-Package are CMI commands only I can't automate that (or can I)? Does anyone know if a way that I could automate that to happen after the source is pulled from TFS but before the build?
The yellow exclamation marks issue should be related to the reference path. When you download the source from TFS to another location, the system cannot find the references as the original reference path changed.
So, you need to reinstall the package, you can use the NuGet command line in the Package Manager Console:
Update-Package -reinstall
since Install-Package and Uninstall-Package are CMI commands only I can't automate that (or can I)? Does anyone know if a way that I could automate that to happen after the source is pulled from TFS but before the build?
The simple answer is you can not automate that. You can use the command Install-Package and Uninstall-Package to reinstall the packages to your project in the Package Manager Console, but it seems impossible to automate that. Please forgive me for the lengthy explanation below.
First, we need to know the different the operation Install packages between NuGet CLI and Package Manager, although NuGet CLI and Package Manager both support the operation Install packages.
The operation Install packages on NuGet CLI:
Obviously, NuGet will not reinstall the references when you using the Install-packages operation on the NuGet CLI, just download the package to the packages folder. See NuGet CLI reference:
The install command does not modify a project file or packages.config;
in this way it's similar to restore in that it only adds packages to
disk but does not change a project's dependencies.
Conversely, operation Install packages on Package Manager:
Installs a package and its dependencies into a project.
If you want to automate that, you have to do this operations via NuGet CLI. Since Install package on NuGet CLI will not modify the reference of project, so we could not automate the operation install package to update the reference of the project.
Besides, we also do not recommend you automate that. Once you have automate that, NuGet execute the uninstall/install operations every time before you build the project. We only need to do an uninstall/install the operation after get the project from TFS. Even we do not need to do this operation if the references of the project are not broken after NuGet restore. So according to the reference of the project to determine whether or not to use an command:
Update-Package -reinstall
in the Package Manager Console should be the best choice.
Entity Framework and Nuget both do this. They add powershell commandlets that can be launched from the visual studio package manager console.
It would be really great if I could write some project-centric utilities that could be committed to my source control and be available for all developers from that console.
How do I do this?
Note that I'm not looking for a 3rd party solution (eg StudioShell), and that I'm aware that I can just write normal powershell scripts to do many things. I'm interested specifically in how to write functions that are first-class citizens in the Visual Studio package manager console like Get-Package and Update-Database.
EntityFramework's integration is done via NuGet, so you can't really have it in a project in your solution easily. You'd have to go through a NuGet package. Although, you could probably make it work using a local folder for the package. Essentially, EF includes a normal powershell module in its package's tools folder along with an init.ps1 that loads the module. Its contents:
param($installPath, $toolsPath, $package, $project)
if (Get-Module | ?{ $_.Name -eq 'EntityFramework' })
{
Remove-Module EntityFramework
}
Import-Module (Join-Path $toolsPath EntityFramework.psd1)
init.ps1 is run by NuGet/VS when opening the solution file. From the NuGet docs:
Init.ps1 runs the first time a package is installed in a solution.
* If the same package is installed into additional projects in the solution, the script is not run during those installations.
* The script also runs every time the solution is opened (Package Manager Console window has to be open at the same for the script to run). For example, if you install a package, close Visual Studio, and then start Visual Studio and open the solution with Package Manager Console window, the Init.ps1 script runs again.
I am trying to create a nuget package using http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#From_a_convention_based_working_directory
as a reference.
My Package Manger Console in Visual Studio is not allowing me to use the 'nuget' command.
I am able to 'Get-help nuguet' and it displays:
The following NuGet cmdlets are included.
Cmdlet Description
------------------ ----------------------------------------------
Get-Package Gets the set of packages available from the package source.
Install-Package Installs a package and its dependencies into the project.
Uninstall-Package Uninstalls a package. If other packages depend on this package,
the command will fail unless the –Force option is specified.
Update-Package Updates a package and its dependencies to a newer version.
Add-BindingRedirect Examines all assemblies within the output path for a project
and adds binding redirects to the application (or web)
configuration file where necessary.
Get-Project Returns a reference to the DTE (Development Tools Environment)
for the specified project. If none is specifed, returns the
default project selected in the Package Manager Console.
Open-PackagePage Open the browser pointing to ProjectUrl, LicenseUrl or
ReportAbuseUrl of the specified package.
Register-TabExpansion Registers a tab expansion for the parameters of a command.
However, whenever I start off commands with nuget is gives :
The term 'nuget' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try ag
ain.
At line:1 char:6
+ nuget <<<<
+ CategoryInfo : ObjectNotFound: (nuget:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
I have tried the following solutions:
1>closing down all items and restarting
2> uninstalling and reinstalling
3>creating a powershell profile file (this didn't exist before and this actually broke everything)
The problem started to appear after I upgraded my Visual Studio 2012 Ultimate trial version to registered. I had originally had the VS 12 Pro installed. I don't know if that really has anything to do with it but I noticed that others that had similar problems have vs 10 and 12 installed.
My question is "does anyone know what else to try?" My theory is that the path to the nuget command is missing but I cannot find how to configure the paths the package manager console uses and I am not sure where the cmdlet nuget is actually stored.
Updated---tried downloading the command line tool as suggested below. This lead to nothing working again. I tried to uninstall and now I have a item in vs2010 extentions for nuget that doesn't have a install or unistall button enabled. This leads me to believe that it has to do with extensions installed via 2010 and 2012 that has a part in my little drama. If anyone also knows how to nuke an uninstallable extension, please advise also but I will try another question for that.
Nuget.exe is placed at .nuget folder of your project. It can't be executed directly in Package Manager Console, but is executed by Powershell commands because these commands build custom path for themselves.
My steps to solve are:
Download NuGet.exe from https://github.com/NuGet/NuGet.Client/releases (give preference for the latest release);
Place NuGet.exe in C:\Program Files\NuGet\Visual Studio 2012 (or your VS version);
Add C:\Program Files\NuGet\Visual Studio 2012 (or your VS version) in PATH environment variable (see http://www.itechtalk.com/thread3595.html as a How-to) (instructions here).
Close and open Visual Studio.
Update
NuGet can be easily installed in your project using the following command:
Install-Package NuGet.CommandLine
In [Package Manager Console] try the below
Install-Package NuGet.CommandLine
There are much nicer ways to do it.
Install Nuget.Build package in you project that you want to pack. May need to close and re-open solution after install.
Install nuget via chocolatey - much nicer. Install chocolatey: https://chocolatey.org/, then run
cinst Nuget.CommandLine
in your command prompt. This will install nuget and setup environment paths, so nuget is always available.
You can also try setting the system variable path to the location of your nuget exe and restarting VS.
Open your system PATH variable and add the location of your nuget.exe (for me this is: C:\Program Files (x86)\NuGet\Visual Studio 2013)
Restart Visual Studio
I would have posted this as a comment to your answer #done_merson but I didn't have the required reputation to do that.
In Visual Studio:
Tools -> Nuget Package Manager -> Package Manager Console.
In PM:
Install-Package NuGet.CommandLine
Close Visual Studio and open it again.
The nuget commandline tool does not come with the vsix file, it's a separate download
https://github.com/nuget/home
Right-click on your project in solution explorer.
Select Manage NuGet Packages for Solution.
Search NuGet.CommandLine by Microsoft and Install it.
On complete installation, you will find a folder named packages in
your project. Go to solution explorer and look for it.
Inside packages look for a folder named NuGet.CommandLine.3.5.0, here 3.5.0 is just version name your folder name will change accordingly.
Inside NuGet.CommandLine.3.5.0 look for a folder named tools.
Inside tools you will get your nuget.exe
Retrieve nuget.exe from https://www.nuget.org/downloads. Copy it to a local folder and add that folder to the PATH environment variable.
This is will make nuget available globally, from any project.
I got around this by finding the nuget.exe and moving to an easy to type path (c:\nuget\nuget) and then calling the nuget with this path. This seems to solve the problem.
c:\nuget\nuget at the package manager console works as expected.
I tried to find the path that the console was using and changing the environment path but was never able to get it to work in that way.
Follow these steps.
In visual studio go to Tools-> NuGet Package Manager->Package Manager Console
Run below command
Install-Package NuGet.CommandLine
Close visual studio and reOpen again
repeat step 1
run your nuget command
eg. nuget push C:\Users\syaads\Debug\Library.1.0.32.nupkg -Source Artifactory
You can find the nuget.exe in your profile folder:
C:\Users\YourProfileName\.nuget\packages\nuget.commandline\6.0.0\tools
If you want to use it gloablly, please register above path in PATH environment variable.
For detailed guide how to do it, please see Add to the PATH in Windows 10
Download nuget.exe from https://www.nuget.org/downloads.
create a new folder in root of C drive e.g c:\nuget, copy the nuget.ext to nuget folder in c drive and paste.
Go to environmental settings.
Go to System Variable Section => select the variable name as Path and double click on path variable => and click on new button in the last add c:\nuget => then apply => save => save.
Download the nuget.exe from the https://www.nuget.org/downloads.
Copy and paste the downloaded file to the relevant folder where your .nupkg is created.
Try to execute the command.
When I try to pack my MVC project (NuGet.exe pack) I get:
NuGet.exe : Access to the path '...' is denied.
This happens to be the case for all files in the content and script folder of my MVC solution. If I remove the readonly flag on all these files NuGet.exe is able to create the NuGet package.
Why do I have to remove the readonly flag? Is there another way?
I'm using TFS which specify the readonly flag on all files under source control.
I am running:
NuGet Version: 1.7.30402.9028
Microsoft Visual Studio 2010 Version 10.0.40219.1 SP1Rel
I'm using the NuGet.exe that you get when you install the NuGet package NuGet.CommandLine which is located at http://nuget.org/packages/NuGet.CommandLine.
Apparently, you need to set ReadOnly=false for the files it accesses
Try running it as administrator.
I ran into this with nuget restore after doing a git clean -fd with VisualStudio open: the packages/ directory was marked for deletion, and while several files were deleted, the packages/ folder itself was not as VisualStudio had the .nupkg files open.
Once I closed VisualStudio and re-ran git clean, it removed the packages/ directory and then nuget was able to restore everthing correctly.
In my case something happened when switching branch in git. Everyone lost execute permissions for Nuget.exe.
This blog post helped me: http://mannysiddiqui.wordpress.com/2013/05/11/nuget-access-is-denied-command-existed-with-code-5/
I was running into a similar problem. I attempted to restart Visual Studio, Run as Administrator (Which I always do), Set the folder attributes to ensure the 'Read-Only' flag was off. Regardless, whatever I did, I still encountered the error "access to the path is denied" when updating my Nu-Get packages.
I was able to fix the issue by updating packages one-by-one. Choosing instead to go through each dependency and updating it. Once the dependency was updated I would choose another, sometimes the same error resulted in which case I would choose another until all my packages were successfully updated.
It appears in my case the Nu-Get packages had to be updated in a particular order.
Hope this helps someone out there
I had this problem and it turned out windows had an update waiting for the next restart. Cleared with no problem after restarting and waiting for the update.
My collegue just got this error, during all "worked on my machine". After some research I found out that the *.nuspec file for some reason wasn't added to the version control.
In order to Restore nuget packages, remove read only permissions from the folder level (for windows). Clean the solution and Build. It will works
In my case it was *.gitattributes in the git repo root recently modified (incorrectly), so git started to checkout nuget.exe on the build server and converted all LF to CRLF inside, making it non-executable.
Run your Visual Studio with administrator rights.