經過多次的實驗,終於完美生成一個.VSIX的項目模板安裝包,其中遇到不少問題與挫折,久經google/baidu/自行摸索.終於解決所有問題.
現將心得記錄總結如下
關於.vstemplate
1.可以通過導出模板直接生成.vstemplate及其他項目文件,以作為 模板的母版! 建議復制一份csprj文件做.vstemplate里面引用的模板項目文件.
2.TargetFileName/TargetFolderName可以根據需要進行修改甚至替換成變量,但是原文件名及目錄名必須存在
3./Project[@TargetFileName]的csproj生成出來的項目文件,語法必須正確,否則不但無法生成項目,錯誤提示也容易讓人誤以為是.vstemplate出錯
4.關於<CustomParameters>,必須放在</Project> 之后,</TemplateContent>之前(schema定義了順序)
5.通過菜單欄導出的項目,生成在 %Userprofile%\Documents\Visual Studio 2012\Templates\My Exported Templates\, 壓縮項目文件為zip時,根目錄必須包含.vstemplate,否則無法出現在VS 模板項目選擇界面中
6.zip后的模板項目文件,需要放 %Userprofile%\Documents\Visual Studio 2012\Templates\ProjectTemplates 方可被VS識別.
7. AssemblyInfo.cs文件也要挪出Properties目錄,並在.vstemplate 修改如下
<ProjectItem ReplaceParameters="true" TargetFileName="Properties\AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
8.vstemplate項目的.cs文件,由於被$變量替換$,正常生成會提示大量錯誤信息.因此需要將所有.cs的"文件屬性--生成操作"設置為"無".
或者在sln解決方案文件中,"配置屬性"中設置該項目為不生成(不推薦使用該方法)
9.可以附加上一個.bat批處理文件.內容如下
cd /d %1 "C:\Program Files\HaoZip\haozipc" a TemplateProject.zip *.* -r move/y TemplateProject.zip ..\Template.Vsix\ProjectTemplates
注釋: 在build項目的時候,執行批處理文件,將項目目錄作為參數%1傳入到bat文件
bat line 1: 進入項目目錄,方便line2的壓縮命令壓縮本目錄及子目錄文件,原因參考第5.點
bat line 2:壓縮命令,使用有命令行的壓縮軟件,例如rar,haozip等.不過haozip很奇怪,我家里的機器是安裝在program files,而公司的機器是program files(x86).但是兩台機操作系統都是x64
bat line 3:上文是移動到vsix的目錄所在位置(推薦,以便使用IWizard生成的dll),實際上可以移動到%Userprofile%\Documents\Visual Studio 2012\Templates\ProjectTemplates直接使用(無IWizard時)
關於IWizard
IWizard也是非常麻煩的東西,因為之前很少用需要注冊到GAC帶簽名的項目,所以當時也走了不少冤枉路
1.需要引用EnvDTE 及 Microsoft.VisualStudio.TemplateWizardInterface
2.只要實現接口方法RunStarted即可,ShouldAddProjectItem方法返回true,其他方法全部留空
3.可以創建一個winform來輸入參數,然后再RunStarted里面初始化這個winform,並ShowDialog();
4.參數replacementsDictionary,既可訪問也可修改,這里可以添加新的替換變量,或者讀取默認替換變量的值
5.項目需要"簽名--為程序集簽名",生成的key文件,必須帶密碼,否則無法添加到GAC
項目copy到其他機器使用時,編譯的時候會提示證書文件相關的錯誤.此時只需在更改密碼處重新輸入一次密碼
6.GAC注冊看似簡單,但還是有注意的地方.首先要使用管理員身份運行vs工具命令提示,然后命令參數需要注意
注冊 gacutil /i 項目名.dll
卸載 gacutil /u 項目名 這里不能帶dll
查看注冊情況 gacutil /lr 項目名 這里不能帶dll
7.在使用vsix項目的時候,可以省略第6點.
關於VSIX項目
想要不注冊GAC,而且可以很炫的分發給別人,可以選擇創建VSIX項目.
但是如果是小團隊合作,我還是推薦注冊GAC,然后在vs中設置模板目錄為共享目錄以訪問vstemplate生成的zip文件
1.需要先下載visual studio 20XX SDK,安裝后可創建VSIX PROJCT(擴展性欄目下)
2.可視化編輯source.extension.vsixmanifest,關鍵是在Asset欄目中新建對應的項
a.對於IWizard生成的DLL,注意要引用包含了IWizard的項目
Type: Microsoft.VisualStudio.Assembly
Embed in this folder填 "Assemblies"
b.對於vstemplate項目
Type:Microsoft.VisualStudio.ProjectTemplate
Source: 可選擇File on System, 選擇文件后,文件會自動copy到ProjectTemplates目錄下.因此, "關於.vstemplate"第9點描述的批處理move位置,應該是該路徑
如果選擇 A project in current solution,請留意以下內容.
3. 選擇 A project in current solution后,如果在編譯時出現提示 "該項目中不存在目標“TemplateProjectOutputGroup”, 那么想必你的project是從菜單欄導出的模板改出來的,如果是"新建--擴展性--C# Template project",是不會出現這個錯誤提示的.
這個問題在google,baidu能搜到有人提問,但是沒有確切解決問題的辦法. 最終我在仔細對比兩套csprj文件后,發現需要添加以下兩項
a.在<PropertyGroup>...</PropertyGroup>中添加下項
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
b.找到<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />在下面添加
<Import Project="$(VSToolsPath)\VSSDK\Microsoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />
且a要先於b.
4.安裝VSIX后,若果在新建項目中還沒看到,請關閉所有vs IDE,重啟后方可顯示.
更新同樣需要先卸載--再安裝--再重啟.
這也是為什么在小團隊中推薦使用設置模板目錄為共享目錄的原因.否則實在是太麻煩了
