4. Developing for SharePoint Online
How can we make development repeatable
How to get to Continuous Integration across
Development, Test, Acceptance and Production
Microsoft only gave us SharePoint Online Admin
Tenant CmdLets
SharePoint Online has 27 cmdlets
SharePoint Onpremise has 730 cmdlets
6. What about SharePoint
Onpremise?
Cloud Ready
Stuff that deploys on SharePoint Online
should also deploy On Premises
Cloud Ready
Dev on premise, deploy to the cloud
7. So what can you do?
(Sandboxed) Event Receivers
rative:
xml, webtemplates, modules
ped in WSP
rePoint Online Powershell CmdLets
Client Side Object Model (CSOM)
Script Object Model
Powershell + Client Side Object Model
8. So what did I do?
Started out with Powershell
Powershell does not know about Generics
ClientContext.Load(<type>);
So: Roll your own cmdlet since .NET does not
have this restriction
9. Demo
Create taxonomy field in both Sharepoint Online and SharePoint onpremise
Extending with Powershell
●
●
●
●
●
●
System.Management.Automation.PSCmdLet
Decorate the class with attributes
Override ProcessRecord method
Use a Service Locator Pattern to dynamically load credential class
Upload and deploy Sandbox Solution automagically
Do some stuff to SharePoint Online / SharePoint OnPremise to finish taxonomy
field
Ingredients
●
●
●
●
●
Sandbox solution defining contenttype
Loaded termset
Both a SharePoint OnPremise server and SharePoint Online tenant
Powershell cmdlet Set-TaxonomyFieldAssociation
SharePoint Client Browser
10. Restrictions
Userprofile properties
Audiences
Deploy/Trust apps: Check out app
stapling -
Activate a sandbox solut
Use DesignPackageInfo –
codeplex (idea from
http://blog.symprogress.com/201
pply-designpackage-using-client-o
model/)
http://blogs.msdn.com/b/richard_dizeregas_blog/arch
ive/2013/03/04/sharepoint-2013-app-deploymentthrough-quot-app-stapling-quot.aspx
Search Schema such as Managed properties (although you can export
config)
Stress the importance of SharePoint OnlineStress the need for repeatable qualitative developmentExample: client had a checked in JS file 1.000 times in 2 years
Example: clickingeverythingtogether in AcceptanceandProductionFor mechanical turk tobeeffectiveyouneeded a goodchessplayer in the machineToerr is human andthatbrings me toanother point in developmentwhichseemstocontradicteverything:Failoften, failfast; learnoften, learnfastThe point being is thatwhat we finallydeliver is somethinggood, somethingthatsucceedsSchool teaches you to think stuff through and not fail; I had to unlearn that, its ok to fail, just make sure it does not cost much
Onpremise we can test but we can also expect to see the same problem onpremise as we see online.Online might take a few hours before the log entry becomes available.Dev – On Premise, Test + Accept + Production - Online
Sandboxed event receivers was my weapon of choice in the past. No longer since partial trusted code is deprecated.Still using sandbox to deploy stuff declaratively – MS is using this in its own Design Manager in 15
Demo 1: Creating the cmdlet that works for both SharePoint Online and SharePoint Onpremise1. Show the template in the template directory2. Inherit from System.Management.Automation.PSCmdlet3. Decorate the class with System.Management.Automation.Cmdlet so you can set the name of the cmdlet4. Context is built up, need to authenticate, just a type of ICredentials for both SharePoint Online and SharePoint Onpremise5. So I used a simple servicelocator to load the correct authentication6. Rename the method where you do the actual work, add the line: this.WriteObject(string.Format("Web name: {0}", web.Title));7. Build it8. Onpremise: Get-Webname -Url http://suguk.rapidcircle-dev.com -User rbethleh -Password Oostakker39 -AuthenticationMethodOnPremise -Domain rapidcircle-dev -Verbose9. Online: Get-Webname -Url https://afghanwhigs.sharepoint.com -User admin@afghanwhigs.onmicrosoft.com -Password pass@word1 -AuthenticationMethodSharePointOnline -Verbose10. So in effect I can use the same cmdlet both in Online and OnPremiseDemo 2: Doing something more complicated, provisioning a sitecolumn and contenttype where the sitecolumn contains a taxonomy field.1. Open the project suguk which is a standard sandbox project defining a sitecolumn of type taxonomy field and point out that you cannot associate the taxonomy2. Open up the taxonomy and show the country3. Show the contenttype Member, we just want to be able to select the country the member is from.4. Show the feature that is to be deployed5. Show the package. Build the package to the build directory6. Now in order to provision this we will need a cmdlet to associate the thetaxonomyfield with the taxonomy itself (as we probably do not know the guids at design time)7. Enter the cmdlet8. Show the implementation of the method9. Open the Powershell ISE, first the dev script (watch that the site does not exist). Point out that we create a sitecollection, upload the package activate it and deploy sandbox solution then run the cmdlet to associate taxonomy10. Open the test script, do the same, activate sandbox solution manually, rest is the same11. Create lists of members