Sometimes we may need to use some third party tools
that create external dependencies to our SharePoint projects. For example if
you use common third party DLL in your SharePoint project in visual studio and
build WSP, then WSP package will include these SharePoint Guidance
libraries also. However, this might create problems related to deployment. To
explain the issue, let’s consider how SharePoint solution retraction/removal
might affects other WSP package deployed in the same SharePoint environment.
Example: Two WSPs sharing a Common Dependency
Let’s consider you have two Visual studio
SharePoint project: SharePoint Project 1 and SharePoint Project 2.
Both projects are using (i.e., referencing) a third party dll (i.e.,
thirdparty.dll). Now if you generate WSP from two different Visual Studio
projects, both WSP will include the thirdparty.dll in their WSP package.
Figure 1:
A single thirdparty.dll is shared by two WSP solutions
As shown in the image above, a single third party
dll is referenced by two Visual studio SharePoint projects. Now when you will
build two different WSP solutions the same third party dll will be included to
two different WSPs. If these two WSPs are deployed in a single SharePoint
server/farm with GAC deployment, then both WSP will deploy the same
ThirdParty.dll in the GAC. Everything will work fine till now.
Problem: retracting/removing one solution will fail
other WSP to work
Now consider a scenario. After deploying the two
WSPs in the production with GAC deployment, you have found a problem with
Project 1 WSP. So you want to remove the Project 1 WSP while you will keep Project
2 WSP. So you will remove the Project 1 WSP. Removing the Project 1 WSP will
remove all the assemblies from GAC/BIN related to the WSP. So removing the
Project 1 WSP will remove thirdparty.dll also from GAC. As soon as you
remove the Project 1 WSP from SharePoint server/farm, Project 2 WSP will fail
to work as it will not find the referenced thirdparty.dll in GAC. So removing
Project 1 WSP or project 2 WSP will remove the thirdparty.dll from GAC and
other dependent WSPs which are using the same dll will fail to work.
Solution: Package your external dependency to new
WSP
The solution to this problem is to exclude
thirdparty.dll from both WSPs and create a new solution package for
thirdparty.dll and deploy as prerequisite for both project. You can do it
easily with SharePoint 2010 Package editor. As a result the thridparty.dll will
not be included in any of the two WSPs.To package a new WSP for the
thirdparty.dll you need to create another new Visual Studio SharePoint projects
which will just include the thirdparty.dll (or any other prerequisites). The
new architecture is shown below:
Figure 2:
Shared thirdparty.dll is included in separate WSP
As shown in the figure 2, now the shared dll
(thirdparty.dll) is excluded from Project 1 and Project 2 WSP. Whether you use
WSPBuilder or SharePoint 2010 project template in Visual studio, you can
exclude one more dlls from the WSP. Then create a new Visual Studio project which
will include the thirdparty.dll and the output WSP package will include the
shared/external dll. Now you will have three WSPs and the new WSP will be
prerequisite WSP for other two WSPs or any other future projects which use this
3rd Party dll.
Now with this model, you can remove Project 1 WSP
or Project 2 WSP from your server without affecting each other. Even if you
remove Project 1 WSP from the Farm/Server, the thirdparty.dll will not be
removed from GAC as it’s not deployed as part of Project 1 WSP. Later if you
want to redeploy the Project 1 WSP again then you don’t need to redeploy the
prerequisite WSP as it’s already deployed in the server. If needed you can
package your external dependency in more than one WSP packages.
Conclusion
If you are developing a SharePoint custom product
that will be deployed in some client’s environment, then you should care about
creating one or more dependency WSP packages. If your SharePoint solution is
developed for a specific client or as an in-house product then you might not
face the problem even if you don’t create a prerequisite WSP package. However
if you are developing a SharePoint solution as a custom product and you don’t
know the client yet, you should create prerequisite WSP package. And then when
you will deploy your product in client server, you can deploy the perquisite or
not depending on if the client has the prerequisite dlls install or not. If the
client has the dlls/prerequisites installed in the farm, you don’t need to
deploy the prerequisite WSP. This will make your SharePoint product more
independent and will have less impact on other SharePoint solution deployed in
the farm.
No comments:
Post a Comment