Pitfalls of RetractSolution

This is quick note about some of the pitfalls with using retractsolution with the allcontenturls option in SharePoint. It's easily done when writing deployment scripts to minimise the hardcoding of specific urls. For example consider the following script:

stsadm -o retractsolution -name mysolution.wsp -allcontenturls -immediate

stsadm -o execadmsvcjobs

stsadm -o deletesolution -name mysolution.wsp

stsadm -o addsolution -filename mysolution.wsp

stsadm -o deploysolution -name mysolution.wsp -url http://www.mywebapplicaton.com -immediate -allowgacdeployment

stsadm -o execadmsvcjobs

The retract command above removes files matching the solution manifest across all web applications. What's not immediately obvious is that this happens regardless of whether the solution was ever deployed to the application in the first place. It's also worth noting that it performs no signature checking against assemblies targeted to the local bin directory prior to their removal.

The result is that any files matching on name will be deleted from those applications even if they were not originally deployed as part of the retracted WSP, and even if they possess a different strong name.

Avoid AllContenturls

So the moral is if you're juggling multiple applications and multiple WSPs, it pays to be specific and avoid allcontenturls, in particular when targeting the bin.

stsadm -o retractsolution -name mysolution.wsp -url http://www.mywebapplicaton.com -immediate

On a related note (not specific to the use of allcontenturls) bare in mind that when retracting WSPs containing shared assemblies targeted to the GAC, that SharePoint is not smart enough to leave a copy behind if it's still referenced by another deployed WSP. It's therefore advisable to package and deploy these assemblies separately at the global scope. This avoids breakage of one application when upgrading another and in the case where upgradesolution is not an option.