Title: Packaging Your Advanced SharePoint Customizations
1Packaging Your Advanced SharePoint Customizations
- Neil Iversen
- Inetium
- http//justaddcode.com
2Solution Basics
- At its core, a solution pushes files around
- The File Bus of SharePoint
- Farm Safe Works across Front Ends
- Deployed to the Farm
3Solution Life Cycle High Level
4Features
- Deployable unit of functionality
- Used to customize SharePoint
- Extensively used by SharePoint itself
- Stored in the Hive
- 12\TEMPLATE\FEATURES
- Each feature in its own directory
5Feature Lifecycle
6Types of Features
- Content Type
- Custom Action
- Delegate Controls
- Events
- Feature Stapling
- Field
- Lists (Templates and Instances)
- Module
- Workflow
7Why do I need this fancy packaging?
- You need something that isnt available in the
OOB Features - The OOB Features do/dont do something you need
- You are deploying something outside of SharePoint
- And you still care about change control
8- Individual Developer Environments
- Developers build functionality into
features/solutions
9Feature Receivers
- Executes code when the state changes
- Key to our ability to make drastic changes
- If you can code it you can do it
- Allows for extremely powerful code to get added
- While still being easily deployable
- Overrides
- FeatureInstalled, FeatureUninstalling
- FeatureActivated, FeatureDeactivating
- Example
- ltFeature Id"0a7e1ca9-ee71-4407-80a0-b5b57f4f6f5d"
- TitleMy Feature Reciever"
- Scope"Site"
- ReceiverAssemblyMyAssembly, Version1.0.0.0,
Cultureneutral, PublicKeyTokene35a4d2663eae0ae"
ReceiverClassMyAssembly.MyFeatureReciever" - xmlns"http//schemas.microsoft.com/sharepoint/"gt
10Feature Receivers Getting Context
- Getting Context
- Retrieving the Current Scoped Object
- SPFeatureReceiverProperties
- SPFeatureReceiverProperties.Feature.Parent
- Cast to the appropriate type
- Scope Web
- SPWeb web (SPWeb)properties.Feature.Parent
- SPSite site (SPSite)properties.Feature.Parent
11Scopes
Database
http//sitecollection
http//external
http//sitecollection/deptA
http//external/clientA
http//sitecollection/deptB
12Demo Our first Custom Feature
13Feature Receivers - Debugging
- Based on Deployment/Activation Method
- Stsadm
- Runs as currently logged in user
- Debug/Console.WriteLine
- System.Diagnostics.Debugger.Launch()
- Web Interface
- Runs as App Pool user
- Need to use logger (EventLog, or some Logging
code) - Attach to w3wp.exe
- DLL Deployment
- Overwrite Existing DLL
- iisreset
- stsadm o activatefeature -force
14Testing Your Code
- Unit Testing Features
- Pretty straight forward if you Develop on a
SharePoint environment - Probably want to ignore your abstraction
violations (SharePoint mocks are tough) - Always test Farm/Scope safety
- Need a multi server environment
- Can you make it part of your build?
15Feature Object Model
- SPFarm.FeatureDefinitions
- SPSite.Features
- SPWeb.Features
- SPFeature
- SPFeatureDefinition
16Demo Exploring the Feature OM
17Feature Properties
- Configuration for your Feature
- Allow different values for Dev/Test/Prod
- Combine with scoped property bags to set
configurations - Example
- ltPropertiesgt
- ltProperty KeyMyKey" Value123" /gt
- ltProperty KeyDBServer" Valueprodsql001" /gt
- lt/Propertiesgt
18Demo Working with Properties
19Manually Activating Features
- Why?
- Evade chaining restrictions (at your own peril)
- Working with Hidden Features
- Manage Stages of a Site with a Web Part
- Creating a Suicide Feature
20Manually Activating a Feature
- Get your Context
- Ex SPWeb
- Find the Feature Collection
- Ex SPWeb.Features
- Find the Features Guid
- Ex Guid featureGuid new Guid(0a7e1ca9-ee71-440
7-80a0-b5b57f4f6f5d) - Activate!
- Ex SPWeb.Features.Add(featureGuid)
21Demo Manually Activating Features
22Feature Properties
- Configuration for your Feature
- Allow different values for Dev/Test/Prod
- Combine with scoped property bags to set
configurations - Example
- ltPropertiesgt
- ltProperty KeyMyKey" Value123" /gt
- ltProperty KeyDBServer" Valueprodsql001" /gt
- lt/Propertiesgt
23Demo Working with Properties
24Dependencies and Features
- Your Feature might need to assume another feature
is already active - Make several smaller features, then wrap them
into a single feature that is dependant on them - Dependencies can only be one level deep
- Example
- ltActivationDependenciesgt
- ltActivationDependency FeatureId"52890518-036f-
4027-babd-f4c7df3ee429" /gt - ltActivationDependency FeatureId"6d276cfc-1c84-
46cc-8566-500e66213e06 " /gt - lt/ActivationDependenciesgt
25Dependency Limitations
- Feature Chains
- Limited to one visible feature
- Dependencies cant be triggered at a higher scope
- Ex Farm Feature cant depend on a Web Feature
- Features cant be automatically activated at
different scopes - Ex Web Feature cant activate a Farm Feature
26Feature Dependency
Parent
Dependant
Web Site App Farm
Web
Site
App
Farm
27(No Transcript)
28Hidden Feature
29Hidden Feature Activate Child
1.
2.
30Hidden Feature - Deactivate
2.
1.
31Hidden Feature - Deactivate
3.
1.
2.
32Demo Dependencies are Tasty!
33Putting it Together
- Problem Modifying the web.config in a Farm Safe
manner - Solution SPWebConfigModification and Features
- SPWebConfigModification is Farm Safe
- Scoping does become an issuee
34- Not for the faint of heart!
35Demo Farm Safe Web.config
36Getting a little crazy
- What about non-SharePoint assets?
- Databases, other web sites,
- Is there an advantage?
- Depends on reason for creating the Feature
- Most common is Devs cant touch Prod
37Other Interesting Approaches
- Manually Deploy across a Farm
- Create your own Timer Jobs
- Manually add them to the different WFEs
- PowerShell Feature
- Execute PowerShell via a Feature
- PowerShell v2 Scripts
- Has ability to execute remote commands
38Demo Deploying SQL Components
39Your Feedback is Important
- Please fill out a session evaluation form and
either put them in the basket near the exit or
drop them off at the conference registration
desk. - Thank you!
40Questions?
41Thanks!
- Neil Iversen
- Inetium
- http//justaddcode.com