summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.proj78
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.dllbin37888 -> 50176 bytes
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.pdbbin83456 -> 122368 bytes
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.targets6
-rw-r--r--projecttemplates/RelyingPartyLogic/RelyingPartyLogic.vstemplate11
-rw-r--r--projecttemplates/WebFormsRelyingParty.vstemplate23
-rw-r--r--projecttemplates/WebFormsRelyingParty/MyTemplate.vstemplate156
-rw-r--r--projecttemplates/WebFormsRelyingParty/WebFormsRelyingParty.vstemplate11
-rw-r--r--src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs63
-rw-r--r--src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj33
-rw-r--r--src/DotNetOpenAuth.BuildTasks/MergeProjectWithVSTemplate.cs96
11 files changed, 300 insertions, 177 deletions
diff --git a/build.proj b/build.proj
index 33f6aa8..cedb1fc 100644
--- a/build.proj
+++ b/build.proj
@@ -5,7 +5,7 @@
<SolutionPath>$(ProjectRoot)\src\$(ProductName).sln</SolutionPath>
<ILMergeOutputAssemblyDirectory>$(OutputPath)\unified\</ILMergeOutputAssemblyDirectory>
<ILMergeOutputAssembly>$(ILMergeOutputAssemblyDirectory)\$(ProductName).dll</ILMergeOutputAssembly>
- <ProjectTemplatesLayoutPath>$(ProjectRoot)\obj\$(Configuration)\projecttemplates\</ProjectTemplatesLayoutPath>
+ <ProjectTemplatesLayoutPath>$(IntermediatePath)projecttemplates\</ProjectTemplatesLayoutPath>
</PropertyGroup>
<Import Project="$(ProjectRoot)\tools\$(ProductName).Versioning.targets"/>
@@ -153,9 +153,7 @@
$(ProjectRoot)\projecttemplates\**\StyleCop.Cache;
$(ProjectRoot)\projecttemplates\**\*.user;
$(ProjectRoot)\projecttemplates\**\obj\**;
- $(ProjectRoot)\projecttemplates\**\bin\DotNetOpenAuth.dll;
- $(ProjectRoot)\projecttemplates\**\bin\DotNetOpenAuth.pdb;
- $(ProjectRoot)\projecttemplates\**\bin\Microsoft.Contracts.dll;
+ $(ProjectRoot)\projecttemplates\**\bin\**;
$(ProjectRoot)\projecttemplates\**\*.ldf;
$(ProjectRoot)\projecttemplates\**\*.mdf;
"/>
@@ -175,17 +173,26 @@
<ProjectTemplatesLayout Include="@(ProjectTemplatesSource->'$(ProjectTemplatesLayoutPath)%(RecursiveDir)%(FileName)%(Extension)')"/>
<ProjectTemplatesTransformLayout Include="@(_ProjectTemplatesTransformSource->'$(ProjectTemplatesLayoutPath)%(RecursiveDir)%(FileName)%(Extension)')"/>
+ <VSProjectTemplates Include="@(ProjectTemplatesLayout)" Condition="'%(Extension)' == '.vstemplate'" />
+ <TopLevelVSProjectTemplates Include="@(VSProjectTemplates)" Condition="'%(RootDir)%(Directory)' == '$(ProjectTemplatesLayoutPath)'" />
+
<!-- Include the template icon -->
- <ProjectTemplatesSource Include="@(ProjectTemplates->'$(ProjectRoot)\doc\logo\dotnetopenid.ico')" />
- <ProjectTemplatesLayout Include="@(ProjectTemplates->'$(ProjectTemplatesLayoutPath)%(RecursiveDir)__TemplateIcon.ico')" />
+ <ProjectTemplatesSource Include="$(ProjectRoot)\doc\logo\dotnetopenid.ico" />
+ <ProjectTemplatesLayout Include="$(ProjectTemplatesLayoutPath)__TemplateIcon.ico" />
<!-- Include the unified, signed version of the library -->
- <ProjectTemplatesSource Include="@(ProjectTemplates->'$(ILMergeOutputAssembly)')" />
- <ProjectTemplatesSource Include="@(ProjectTemplates->'$(ILMergeOutputAssemblyDirectory)\$(ProductName).pdb')" />
- <ProjectTemplatesSource Include="@(ProjectTemplates->'$(OutputPath)\$(ProductName).Contracts.dll')" />
- <ProjectTemplatesLayout Include="@(ProjectTemplates->'$(ProjectTemplatesLayoutPath)%(RecursiveDir)bin\$(ProductName).dll')" />
- <ProjectTemplatesLayout Include="@(ProjectTemplates->'$(ProjectTemplatesLayoutPath)%(RecursiveDir)bin\$(ProductName).pdb')" />
- <ProjectTemplatesLayout Include="@(ProjectTemplates->'$(ProjectTemplatesLayoutPath)%(RecursiveDir)bin\$(ProductName).Contracts.dll')" />
+ <ProjectTemplatesSource Include="$(ILMergeOutputAssembly)" />
+ <ProjectTemplatesLayout Include="$(ProjectTemplatesLayoutPath)lib\$(ProductName).dll" />
+ <ProjectTemplatesSource Include="$(ILMergeOutputAssemblyDirectory)\$(ProductName).pdb" />
+ <ProjectTemplatesLayout Include="$(ProjectTemplatesLayoutPath)lib\$(ProductName).pdb" />
+ <ProjectTemplatesSource Include="$(OutputPath)\$(ProductName).Contracts.dll" />
+ <ProjectTemplatesLayout Include="$(ProjectTemplatesLayoutPath)lib\$(ProductName).Contracts.dll" />
+
+ <!-- ... and log4net -->
+ <ProjectTemplatesSource Include="$(ProjectRoot)\lib\log4net.dll" />
+ <ProjectTemplatesLayout Include="$(ProjectTemplatesLayoutPath)lib\log4net.dll" />
+ <ProjectTemplatesSource Include="$(ProjectRoot)\lib\log4net.xml" />
+ <ProjectTemplatesLayout Include="$(ProjectTemplatesLayoutPath)lib\log4net.xml" />
</ItemGroup>
<Trim Inputs="@(_ProjectTemplatesTransformSource)" MetadataName="BeforeTokens" AllAfter="\">
<Output TaskParameter="Outputs" ItemName="ProjectTemplatesTransformSource" />
@@ -199,22 +206,51 @@
<ChangeProjectReferenceToAssemblyReference
Projects="@(CopiedProjectTemplateFiles)"
Condition="'%(Extension)' == '.csproj'"
- ProjectReference="..\..\src\$(ProductName)\$(ProductName).csproj"
+ ProjectReference="..\..\src\$(ProductName)\$(ProductName).csproj"
Reference="Bin\$(ProductName).dll" />
+ <MergeProjectWithVSTemplate
+ ProjectItemTypes="@(VsTemplateProjectItemTypes)"
+ ReplaceParametersExtensions="@(VsTemplateParameterReplaceExtensions)"
+ Templates="@(VSProjectTemplates)"
+ />
</Target>
<Target Name="ProjectTemplates" DependsOnTargets="ProjectTemplatesLayout">
- <PropertyGroup>
- <WebFormsRelyingPartyZipFile>$(ProjectTemplatesLayoutPath)\WebFormsRelyingParty.zip</WebFormsRelyingPartyZipFile>
- </PropertyGroup>
<ItemGroup>
- <WebFormsRelyingPartyProjectTemplateLayout Include="$(ProjectTemplatesLayoutPath)\WebFormsRelyingParty\**\*" />
+ <VSProjectTemplateZipFiles Include="@(TopLevelVSProjectTemplates->'%(RootDir)%(Directory)%(FileName).zip')" />
+ </ItemGroup>
+
+ <DiscoverProjectTemplates TopLevelTemplates="@(TopLevelVSProjectTemplates)">
+ <Output TaskParameter="ProjectTemplates" ItemName="SubVSTemplates" />
+ <Output TaskParameter="ProjectTemplateContents" ItemName="TemplateItemContents" />
+ </DiscoverProjectTemplates>
+
+ <ItemGroup>
+ <!-- Include in each template .zip file the top-level .vstemplate file itself. -->
+ <VSProjectTemplateContents Include="@(TopLevelVSProjectTemplates)">
+ <ZipFile>$(ProjectTemplatesLayoutPath)%(FileName).zip</ZipFile>
+ <WorkingDirectory>$(ProjectTemplatesLayoutPath)</WorkingDirectory>
+ </VSProjectTemplateContents>
+
+ <!-- Now throw in all the files in each of the project-level template's directories and their children. -->
+ <VSProjectTemplateContents Include="@(TemplateItemContents)">
+ <ZipFile>$(ProjectTemplatesLayoutPath)%(TemplateItemContents.TopLevelTemplateFileName).zip</ZipFile>
+ <WorkingDirectory>$(ProjectTemplatesLayoutPath)</WorkingDirectory>
+ </VSProjectTemplateContents>
+
+ <!-- Include the template icon for each .zip file. -->
+ <VSProjectTemplateContents Include="@(TopLevelVSProjectTemplates->'$(ProjectTemplatesLayoutPath)__TemplateIcon.ico')">
+ <ZipFile>$(ProjectTemplatesLayoutPath)%(TopLevelVSProjectTemplates.FileName).zip</ZipFile>
+ <WorkingDirectory>$(ProjectTemplatesLayoutPath)</WorkingDirectory>
+ </VSProjectTemplateContents>
</ItemGroup>
- <Delete Files="$(WebFormsRelyingPartyZipFile)" />
+
+ <Delete Files="@(VSProjectTemplateZipFiles)" />
<Zip
- Files="@(WebFormsRelyingPartyProjectTemplateLayout)"
- ZipFileName="$(WebFormsRelyingPartyZipFile)"
- WorkingDirectory="$(ProjectTemplatesLayoutPath)\WebFormsRelyingParty" />
+ Files="@(VSProjectTemplateContents)"
+ ZipFileName="%(VSProjectTemplateContents.ZipFile)"
+ WorkingDirectory="%(VSProjectTemplateContents.WorkingDirectory)"
+ />
</Target>
<Target Name="Documentation" DependsOnTargets="BuildProduct;Chm" Condition="'$(NoDocumentation)' != 'true'">
diff --git a/lib/DotNetOpenAuth.BuildTasks.dll b/lib/DotNetOpenAuth.BuildTasks.dll
index a246041..b2aa255 100644
--- a/lib/DotNetOpenAuth.BuildTasks.dll
+++ b/lib/DotNetOpenAuth.BuildTasks.dll
Binary files differ
diff --git a/lib/DotNetOpenAuth.BuildTasks.pdb b/lib/DotNetOpenAuth.BuildTasks.pdb
index 96ea71a..34c368d 100644
--- a/lib/DotNetOpenAuth.BuildTasks.pdb
+++ b/lib/DotNetOpenAuth.BuildTasks.pdb
Binary files differ
diff --git a/lib/DotNetOpenAuth.BuildTasks.targets b/lib/DotNetOpenAuth.BuildTasks.targets
index cfc9e18..3ad679f 100644
--- a/lib/DotNetOpenAuth.BuildTasks.targets
+++ b/lib/DotNetOpenAuth.BuildTasks.targets
@@ -3,6 +3,10 @@
<PropertyGroup>
<ProjectRoot Condition="'$(ProjectRoot)' == ''">$(MSBuildProjectDirectory)\..\..</ProjectRoot>
</PropertyGroup>
+ <ItemGroup>
+ <VsTemplateParameterReplaceExtensions Include=".cs;.csproj;.sql;.config;.Master;.aspx;.vb" />
+ <VsTemplateProjectItemTypes Include="Compile;EmbeddedResource;EntityDeploy;Content;None" />
+ </ItemGroup>
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="GetBuildVersion" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="SetEnvironmentVariable" />
@@ -17,5 +21,7 @@
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="FilterItems" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="JsPack" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="CopyWithTokenSubstitution" />
+ <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="MergeProjectWithVSTemplate" />
+ <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="DiscoverProjectTemplates" />
</Project>
diff --git a/projecttemplates/RelyingPartyLogic/RelyingPartyLogic.vstemplate b/projecttemplates/RelyingPartyLogic/RelyingPartyLogic.vstemplate
new file mode 100644
index 0000000..243d820
--- /dev/null
+++ b/projecttemplates/RelyingPartyLogic/RelyingPartyLogic.vstemplate
@@ -0,0 +1,11 @@
+<VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
+ <TemplateData>
+ <Name>ASP.NET OpenID-InfoCard RP</Name>
+ <Description>An ASP.NET web forms web site that accepts OpenID and InfoCard logins</Description>
+ <ProjectType>CSharp</ProjectType>
+ <Icon>__TemplateIcon.ico</Icon>
+ </TemplateData>
+ <TemplateContent>
+ <Project File="RelyingPartyLogic.csproj" ReplaceParameters="true" />
+ </TemplateContent>
+</VSTemplate> \ No newline at end of file
diff --git a/projecttemplates/WebFormsRelyingParty.vstemplate b/projecttemplates/WebFormsRelyingParty.vstemplate
new file mode 100644
index 0000000..e582d63
--- /dev/null
+++ b/projecttemplates/WebFormsRelyingParty.vstemplate
@@ -0,0 +1,23 @@
+<VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="ProjectGroup">
+ <TemplateData>
+ <Name>ASP.NET OpenID-InfoCard RP</Name>
+ <RequiredFrameworkVersion>3.5</RequiredFrameworkVersion>
+ <Description>An ASP.NET web forms web site that accepts OpenID and InfoCard logins</Description>
+ <ProjectType>CSharp</ProjectType>
+ <ProjectSubType>Web</ProjectSubType>
+ <NumberOfParentCategoriesToRollUp>2</NumberOfParentCategoriesToRollUp>
+ <SortOrder>1000</SortOrder>
+ <CreateNewFolder>true</CreateNewFolder>
+ <DefaultName>WebRPApplication</DefaultName>
+ <ProvideDefaultName>true</ProvideDefaultName>
+ <LocationField>Enabled</LocationField>
+ <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
+ <Icon>__TemplateIcon.ico</Icon>
+ </TemplateData>
+ <TemplateContent>
+ <ProjectCollection>
+ <ProjectTemplateLink ProjectName="$projectname$">WebFormsRelyingParty\WebFormsRelyingParty.vstemplate</ProjectTemplateLink>
+ <ProjectTemplateLink ProjectName="RelyingPartyLogic">RelyingPartyLogic\RelyingPartyLogic.vstemplate</ProjectTemplateLink>
+ </ProjectCollection>
+ </TemplateContent>
+</VSTemplate> \ No newline at end of file
diff --git a/projecttemplates/WebFormsRelyingParty/MyTemplate.vstemplate b/projecttemplates/WebFormsRelyingParty/MyTemplate.vstemplate
deleted file mode 100644
index 11e4373..0000000
--- a/projecttemplates/WebFormsRelyingParty/MyTemplate.vstemplate
+++ /dev/null
@@ -1,156 +0,0 @@
-<VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
- <TemplateData>
- <Name>ASP.NET OpenID-InfoCard RP</Name>
- <RequiredFrameworkVersion>3.5</RequiredFrameworkVersion>
- <Description>An ASP.NET web forms web site that accepts OpenID and InfoCard logins</Description>
- <ProjectType>CSharp</ProjectType>
- <ProjectSubType>Web</ProjectSubType>
- <NumberOfParentCategoriesToRollUp>2</NumberOfParentCategoriesToRollUp>
- <SortOrder>1000</SortOrder>
- <CreateNewFolder>true</CreateNewFolder>
- <DefaultName>WebRPApplication</DefaultName>
- <ProvideDefaultName>true</ProvideDefaultName>
- <LocationField>Enabled</LocationField>
- <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
- <Icon>__TemplateIcon.ico</Icon>
- </TemplateData>
- <TemplateContent>
- <Project TargetFileName="RelyingPartyLogic.csproj" File="RelyingPartyLogic" ReplaceParameters="true">
- <ProjectItem ReplaceParameters="true">Class1.cs</ProjectItem>
- <Folder Name="Properties" TargetFolderName="Properties">
- <ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
- </Folder>
- </Project>
- <Project TargetFileName="WebFormsRelyingParty.csproj" File="WebFormsRelyingParty.csproj" ReplaceParameters="true">
- <Folder Name="Admin" TargetFolderName="Admin">
- <ProjectItem ReplaceParameters="true" TargetFileName="Admin.Master">Admin.Master</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Admin.Master.cs">Admin.Master.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Admin.Master.designer.cs">Admin.Master.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="CreateDatabase.sql">CreateDatabase.sql</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx">Default.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx.cs">Default.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx.designer.cs">Default.aspx.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Web.config">Web.config</ProjectItem>
- </Folder>
- <Folder Name="App_Data" TargetFolderName="App_Data" />
- <Folder Name="bin" TargetFolderName="bin">
- <ProjectItem ReplaceParameters="false" TargetFileName="DotNetOpenAuth.dll">DotNetOpenAuth.dll</ProjectItem>
- <ProjectItem ReplaceParameters="false" TargetFileName="DotNetOpenAuth.Contracts.dll">DotNetOpenAuth.Contracts.dll</ProjectItem>
- <ProjectItem ReplaceParameters="false" TargetFileName="DotNetOpenAuth.pdb">DotNetOpenAuth.pdb</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="DotNetOpenAuth.xml">DotNetOpenAuth.xml</ProjectItem>
- <ProjectItem ReplaceParameters="false" TargetFileName="log4net.dll">log4net.dll</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="log4net.xml">log4net.xml</ProjectItem>
- </Folder>
- <Folder Name="Code" TargetFolderName="Code">
- <ProjectItem ReplaceParameters="true">DataRoleProvider.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthAuthenticationModule.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthAuthorizationManager.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthConsumerTokenManager.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthPrincipalAuthorizationPolicy.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthServiceProvider.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthServiceProviderTokenManager.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthTokenManager.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">Policies.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">Utilities.cs</ProjectItem>
- </Folder>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx">Default.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx.cs">Default.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx.designer.cs">Default.aspx.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Global.asax">Global.asax</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Global.asax.cs">Global.asax.cs</ProjectItem>
- <Folder Name="images" TargetFolderName="images">
- <ProjectItem ReplaceParameters="false" TargetFileName="google.gif">google.gif</ProjectItem>
- <ProjectItem ReplaceParameters="false" TargetFileName="infocard_23x16.png">infocard_23x16.png</ProjectItem>
- <ProjectItem ReplaceParameters="false" TargetFileName="openid_login.gif">openid_login.gif</ProjectItem>
- <ProjectItem ReplaceParameters="false" TargetFileName="yahoo.gif">yahoo.gif</ProjectItem>
- <ProjectItem>myopenid.png</ProjectItem>
- <ProjectItem>openid.gif</ProjectItem>
- <ProjectItem ReplaceParameters="false" TargetFileName="yahoo_login.png">yahoo_login.png</ProjectItem>
- </Folder>
- <ProjectItem ReplaceParameters="true" TargetFileName="Login.aspx">Login.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Login.aspx.cs">Login.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Login.aspx.designer.cs">Login.aspx.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="LoginFrame.aspx">LoginFrame.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="LoginFrame.aspx.cs">LoginFrame.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="LoginFrame.aspx.designer.cs">LoginFrame.aspx.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Logout.aspx">Logout.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Logout.aspx.cs">Logout.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Logout.aspx.designer.cs">Logout.aspx.designer.cs</ProjectItem>
- <Folder Name="Members" TargetFolderName="Members">
- <ProjectItem ReplaceParameters="true" TargetFileName="AccountInfo.aspx">AccountInfo.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="AccountInfo.aspx.cs">AccountInfo.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="AccountInfo.aspx.designer.cs">AccountInfo.aspx.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx">Default.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx.cs">Default.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Default.aspx.designer.cs">Default.aspx.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Web.config">Web.config</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthAuthorize.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthAuthorize.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuthAuthorize.aspx.designer.cs</ProjectItem>
- </Folder>
- <ProjectItem ReplaceParameters="true">Model.IssuedAccessToken.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">Model.IssuedRequestToken.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">Model.AuthenticationToken.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">Model.User.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">Model.Consumer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="false" TargetFileName="Model.edmx">Model.edmx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Model.Designer.cs">Model.Designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuth.ashx</ProjectItem>
- <ProjectItem ReplaceParameters="true">OAuth.ashx.cs</ProjectItem>
- <Folder Name="Properties" TargetFolderName="Properties">
- <ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
- </Folder>
- <Folder Name="scripts" TargetFolderName="scripts">
- <ProjectItem>jquery-1.3.1.js</ProjectItem>
- <ProjectItem>jquery-ui-personalized-1.6rc6.js</ProjectItem>
- <ProjectItem>jquery-ui-personalized-1.6rc6.min.js</ProjectItem>
- <ProjectItem>jquery.cookie.js</ProjectItem>
- <ProjectItem>LoginLink.js</ProjectItem>
- </Folder>
- <Folder Name="styles">
- <ProjectItem>loginpopup.css</ProjectItem>
- <ProjectItem>Standard.css</ProjectItem>
- </Folder>
- <Folder Name="theme">
- <Folder Name="images">
- <ProjectItem>ui-bg_flat_55_999999_40x100.png</ProjectItem>
- <ProjectItem>ui-bg_flat_75_aaaaaa_40x100.png</ProjectItem>
- <ProjectItem>ui-bg_glass_45_0078ae_1x400.png</ProjectItem>
- <ProjectItem>ui-bg_glass_55_f8da4e_1x400.png</ProjectItem>
- <ProjectItem>ui-bg_glass_75_79c9ec_1x400.png</ProjectItem>
- <ProjectItem>ui-bg_gloss-wave_45_e14f1c_500x100.png</ProjectItem>
- <ProjectItem>ui-bg_gloss-wave_50_6eac2c_500x100.png</ProjectItem>
- <ProjectItem>ui-bg_gloss-wave_75_2191c0_500x100.png</ProjectItem>
- <ProjectItem>ui-bg_inset-hard_100_fcfdfd_1x100.png</ProjectItem>
- <ProjectItem>ui-icons_0078ae_256x240.png</ProjectItem>
- <ProjectItem>ui-icons_056b93_256x240.png</ProjectItem>
- <ProjectItem>ui-icons_d8e7f3_256x240.png</ProjectItem>
- <ProjectItem>ui-icons_e0fdff_256x240.png</ProjectItem>
- <ProjectItem>ui-icons_f5e175_256x240.png</ProjectItem>
- <ProjectItem>ui-icons_f7a50d_256x240.png</ProjectItem>
- <ProjectItem>ui-icons_fcd113_256x240.png</ProjectItem>
- </Folder>
- <ProjectItem>ui.accordion.css</ProjectItem>
- <ProjectItem>ui.all.css</ProjectItem>
- <ProjectItem>ui.base.css</ProjectItem>
- <ProjectItem>ui.core.css</ProjectItem>
- <ProjectItem>ui.datepicker.css</ProjectItem>
- <ProjectItem>ui.dialog.css</ProjectItem>
- <ProjectItem>ui.progressbar.css</ProjectItem>
- <ProjectItem>ui.resizable.css</ProjectItem>
- <ProjectItem>ui.slider.css</ProjectItem>
- <ProjectItem>ui.tabs.css</ProjectItem>
- <ProjectItem>ui.theme.css</ProjectItem>
- </Folder>
- <ProjectItem ReplaceParameters="true" TargetFileName="Setup.aspx">Setup.aspx</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Setup.aspx.cs">Setup.aspx.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Setup.aspx.designer.cs">Setup.aspx.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Site.Master">Site.Master</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Site.Master.cs">Site.Master.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Site.Master.designer.cs">Site.Master.designer.cs</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="GettingStarted.htm" OpenInWebBrowser="true">GettingStarted.htm</ProjectItem>
- <ProjectItem ReplaceParameters="true" TargetFileName="Web.config">Web.config</ProjectItem>
- <ProjectItem>xrds.aspx</ProjectItem>
- </Project>
- </TemplateContent>
-</VSTemplate> \ No newline at end of file
diff --git a/projecttemplates/WebFormsRelyingParty/WebFormsRelyingParty.vstemplate b/projecttemplates/WebFormsRelyingParty/WebFormsRelyingParty.vstemplate
new file mode 100644
index 0000000..551e6bd
--- /dev/null
+++ b/projecttemplates/WebFormsRelyingParty/WebFormsRelyingParty.vstemplate
@@ -0,0 +1,11 @@
+<VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
+ <TemplateData>
+ <Name>ASP.NET OpenID-InfoCard RP</Name>
+ <Description>An ASP.NET web forms web site that accepts OpenID and InfoCard logins</Description>
+ <ProjectType>CSharp</ProjectType>
+ <Icon>__TemplateIcon.ico</Icon>
+ </TemplateData>
+ <TemplateContent>
+ <Project File="WebFormsRelyingParty.csproj" ReplaceParameters="true" />
+ </TemplateContent>
+</VSTemplate> \ No newline at end of file
diff --git a/src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs b/src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs
new file mode 100644
index 0000000..0162c16
--- /dev/null
+++ b/src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs
@@ -0,0 +1,63 @@
+//-----------------------------------------------------------------------
+// <copyright file="DiscoverProjectTemplates.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.BuildTasks {
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Linq;
+ using System.Text;
+ using System.Xml.Linq;
+ using Microsoft.Build.Framework;
+ using Microsoft.Build.Utilities;
+
+ public class DiscoverProjectTemplates : Task {
+ public ITaskItem[] TopLevelTemplates { get; set; }
+
+ [Output]
+ public ITaskItem[] ProjectTemplates { get; set; }
+
+ [Output]
+ public ITaskItem[] ProjectTemplateContents { get; set; }
+
+ /// <summary>
+ /// Executes this instance.
+ /// </summary>
+ public override bool Execute() {
+ List<ITaskItem> projectTemplates = new List<ITaskItem>();
+ List<ITaskItem> projectTemplateContents = new List<ITaskItem>();
+ foreach (ITaskItem topLevelTemplate in this.TopLevelTemplates) {
+ var vsTemplate = XElement.Load(topLevelTemplate.ItemSpec);
+ var templateContent = vsTemplate.Element(XName.Get("TemplateContent", MergeProjectWithVSTemplate.VSTemplateNamespace));
+ var projectCollection = templateContent.Element(XName.Get("ProjectCollection", MergeProjectWithVSTemplate.VSTemplateNamespace));
+ var links = projectCollection.Elements(XName.Get("ProjectTemplateLink", MergeProjectWithVSTemplate.VSTemplateNamespace));
+ var subTemplates = links.Select(
+ link => (ITaskItem)new TaskItem(
+ link.Value,
+ new Dictionary<string, string> {
+ { "TopLevelTemplate", topLevelTemplate.ItemSpec },
+ { "TopLevelTemplateFileName", Path.GetFileNameWithoutExtension(topLevelTemplate.ItemSpec) },
+ }));
+ projectTemplates.AddRange(subTemplates);
+
+ foreach (var link in links.Select(link => link.Value)) {
+ string[] files = Directory.GetFiles(Path.Combine(Path.GetDirectoryName(topLevelTemplate.ItemSpec), Path.GetDirectoryName(link)), "*.*", SearchOption.AllDirectories);
+ projectTemplateContents.AddRange(files.Select(file => (ITaskItem)new TaskItem(
+ file,
+ new Dictionary<string, string> {
+ { "TopLevelTemplate", topLevelTemplate.ItemSpec },
+ { "TopLevelTemplateFileName", Path.GetFileNameWithoutExtension(topLevelTemplate.ItemSpec) },
+ })));
+ }
+ }
+
+ this.ProjectTemplates = projectTemplates.ToArray();
+ this.ProjectTemplateContents = projectTemplateContents.ToArray();
+
+ return !this.Log.HasLoggedErrors;
+ }
+ }
+}
diff --git a/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj b/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
index 3b22fff..068af4b 100644
--- a/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
+++ b/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
@@ -21,6 +21,33 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
+ <CodeContractsEnableRuntimeChecking>True</CodeContractsEnableRuntimeChecking>
+ <CodeContractsRuntimeOnlyPublicSurface>False</CodeContractsRuntimeOnlyPublicSurface>
+ <CodeContractsRuntimeThrowOnFailure>False</CodeContractsRuntimeThrowOnFailure>
+ <CodeContractsRuntimeCallSiteRequires>False</CodeContractsRuntimeCallSiteRequires>
+ <CodeContractsRunCodeAnalysis>False</CodeContractsRunCodeAnalysis>
+ <CodeContractsNonNullObligations>False</CodeContractsNonNullObligations>
+ <CodeContractsBoundsObligations>False</CodeContractsBoundsObligations>
+ <CodeContractsArithmeticObligations>False</CodeContractsArithmeticObligations>
+ <CodeContractsRedundantAssumptions>False</CodeContractsRedundantAssumptions>
+ <CodeContractsRunInBackground>True</CodeContractsRunInBackground>
+ <CodeContractsShowSquigglies>False</CodeContractsShowSquigglies>
+ <CodeContractsUseBaseLine>False</CodeContractsUseBaseLine>
+ <CodeContractsEmitXMLDocs>False</CodeContractsEmitXMLDocs>
+ <CodeContractsCustomRewriterAssembly>
+ </CodeContractsCustomRewriterAssembly>
+ <CodeContractsCustomRewriterClass>
+ </CodeContractsCustomRewriterClass>
+ <CodeContractsLibPaths>
+ </CodeContractsLibPaths>
+ <CodeContractsPlatformPath>
+ </CodeContractsPlatformPath>
+ <CodeContractsExtraAnalysisOptions>
+ </CodeContractsExtraAnalysisOptions>
+ <CodeContractsBaseLineFile>
+ </CodeContractsBaseLineFile>
+ <CodeContractsRuntimeCheckingLevel>Full</CodeContractsRuntimeCheckingLevel>
+ <CodeContractsReferenceAssembly>%28none%29</CodeContractsReferenceAssembly>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@@ -36,6 +63,7 @@
<Reference Include="Microsoft.Build.Utilities.v3.5">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
+ <Reference Include="Microsoft.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=736440c9b414ea16, processorArchitecture=MSIL" />
<Reference Include="Microsoft.Web.Administration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(SystemRoot)\System32\inetsrv\Microsoft.Web.Administration.dll</HintPath>
@@ -46,6 +74,9 @@
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
+ <Reference Include="System.Xml.Linq">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ChangeProjectReferenceToAssemblyReference.cs" />
@@ -54,8 +85,10 @@
<Compile Include="CopyWithTokenSubstitution.cs" />
<Compile Include="CreateWebApplication.cs" />
<Compile Include="DeleteWebApplication.cs" />
+ <Compile Include="DiscoverProjectTemplates.cs" />
<Compile Include="ECMAScriptPacker.cs" />
<Compile Include="FilterItems.cs" />
+ <Compile Include="MergeProjectWithVSTemplate.cs" />
<Compile Include="GetBuildVersion.cs" />
<Compile Include="CheckAdminRights.cs" />
<Compile Include="JsPack.cs" />
diff --git a/src/DotNetOpenAuth.BuildTasks/MergeProjectWithVSTemplate.cs b/src/DotNetOpenAuth.BuildTasks/MergeProjectWithVSTemplate.cs
new file mode 100644
index 0000000..cbdb849
--- /dev/null
+++ b/src/DotNetOpenAuth.BuildTasks/MergeProjectWithVSTemplate.cs
@@ -0,0 +1,96 @@
+//-----------------------------------------------------------------------
+// <copyright file="MergeProjectWithVSTemplate.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.BuildTasks {
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Text;
+ using Microsoft.Build.Framework;
+ using Microsoft.Build.Utilities;
+ using System.Xml.Linq;
+ using System.IO;
+ using Microsoft.Build.BuildEngine;
+ using System.Diagnostics.Contracts;
+
+ public class MergeProjectWithVSTemplate : Task {
+ internal const string VSTemplateNamespace = "http://schemas.microsoft.com/developer/vstemplate/2005";
+
+ public string[] ProjectItemTypes { get; set; }
+
+ public string[] ReplaceParametersExtensions { get; set; }
+
+ public ITaskItem[] Templates { get; set; }
+
+ /// <summary>
+ /// Executes this instance.
+ /// </summary>
+ public override bool Execute() {
+ foreach(ITaskItem sourceTemplateTaskItem in this.Templates) {
+ var template = XElement.Load(sourceTemplateTaskItem.ItemSpec);
+ var templateContentElement = template.Element(XName.Get("TemplateContent", VSTemplateNamespace));
+ var projectElement = templateContentElement.Element(XName.Get("Project", VSTemplateNamespace));
+ if (projectElement == null) {
+ Log.LogMessage("Skipping merge of \"{0}\" with a project because no project was referenced from the template.", sourceTemplateTaskItem.ItemSpec);
+ continue;
+ }
+
+ var projectPath = Path.Combine(Path.GetDirectoryName(sourceTemplateTaskItem.ItemSpec), projectElement.Attribute("File").Value);
+ Log.LogMessage("Merging project \"{0}\" with \"{1}\".", projectPath, sourceTemplateTaskItem.ItemSpec);
+ var sourceProject = new Microsoft.Build.BuildEngine.Project();
+ sourceProject.Load(projectPath);
+
+ // Collect the project items from the project that are appropriate
+ // to include in the .vstemplate file.
+ var itemsByFolder = from item in sourceProject.EvaluatedItems.Cast<BuildItem>()
+ where this.ProjectItemTypes.Contains(item.Name)
+ orderby item.Include
+ group item by Path.GetDirectoryName(item.Include);
+ foreach (var folder in itemsByFolder) {
+ XElement parentNode = FindOrCreateParent(folder.Key, projectElement);
+
+ foreach (var item in folder) {
+ bool replaceParameters = this.ReplaceParametersExtensions.Contains(Path.GetExtension(item.Include));
+ var projectItem = new XElement(
+ XName.Get("ProjectItem", VSTemplateNamespace),
+ new XAttribute("ReplaceParameters", replaceParameters ? "true" : "false"),
+ Path.GetFileName(item.Include));
+ parentNode.Add(projectItem);
+ }
+ }
+
+ template.Save(sourceTemplateTaskItem.ItemSpec);
+ }
+
+ return !Log.HasLoggedErrors;
+ }
+
+ private static XElement FindOrCreateParent(string directoryName, XElement projectElement) {
+ Contract.Requires<ArgumentNullException>(projectElement != null);
+
+ if (string.IsNullOrEmpty(directoryName)) {
+ return projectElement;
+ }
+
+ string[] segments = directoryName.Split(Path.DirectorySeparatorChar);
+ XElement parent = projectElement;
+ for (int i = 0; i < segments.Length; i++) {
+ var candidateName = XName.Get("Folder", VSTemplateNamespace);
+ var candidate = parent.Elements(XName.Get("Folder", VSTemplateNamespace)).FirstOrDefault(n => n.Attribute("Name").Value == segments[i]);
+ if (candidate == null) {
+ candidate = new XElement(
+ candidateName,
+ new XAttribute("Name", segments[i]));
+ parent.Add(candidate);
+ }
+
+ parent = candidate;
+ }
+
+ return parent;
+ }
+ }
+}