четверг, 23 сентября 2010 г.

Рефакторинг модулей SharePoint-проектов

Есть у SharePoint несколько недоработок и тонкостей. В частности, не очень проработан рефакторинг, с чем я и столкнулся не далее как вчера. Ошибок, при этом, выдается множество самых разных, причем большинство - не слишком внятные.

Я видел вот такие ошибки:
Feature1.feature : error : The following file can not be found: "<путь к файлу>".
Error occurred in deployment step 'Activate Features': Failed to instantiate file "<имя файла>" from module "<название модуля>": Source path "Features\Feature1\<путь к файлу внутри фичи>" not found.
Error occurred in deployment step 'Activate Features': The specified name is already in use. The document or folder name was not changed. To change the name to a different value, close this dialog and edit the properties of the document or folder.
Все эти ошибки связаны с перемещением файлов между модулями (шаблон элемента SharePoint -> 2010 -> Module), переименованиями модулей и т.п.

Эксперимент

Итак, давайте посмотрим на примере, как это происходит. К примеру, я создаю новый Module1. Давайте сразу же добавим в него еще 1 модуль, вложенный, Module2. В больших проектах вложенные модули - это очень хорошая и часто используемая практика, поскольку хранить больше 10 модулей в корневой папке проекта это совершенно ненаглядно и неудобно.

Итак, мы добавили 2 модуля, в каждом модуле по одному файлу: Sample.txt. Чтобы не запутаться, переименуем Sample.txt из модуля Module1, в Sample1.txt, из модуля Module2 - в Sample2.txt.



Заметьте, на текущий момент проект без проблем деплоится:
=== Deploy: 1 succeeded, 0 failed, 0 skipped ===
А теперь давайте перетащим Sample1.txt в модуль Module2:



Запускаем Deploy - получаем ошибку!



Исследование

Давайте поищем все вхождения "Sample1.txt":
Получаем вот такую интересную картину:
Find all "Sample1.txt", Subfolders, Find Results 1, "Entire Solution"
D:\Projects\SharePointProject1\SharePointProject1\Module1\Module2\Elements.xml(5):<File Path="Module2\Sample1.txt" Url="Module2/Sample1.txt" />
D:\Projects\SharePointProject1\SharePointProject1\Module1\Module2\SharePointProjectItem.spdata(6): <ProjectItemFile Source="Module2\Sample1.txt" Target="Module2\" Type="ElementFile" />
Matching lines: 2 Matching files: 2 Total files searched: 37
Ага! Оказывается, есть такой интересный файлик SharePointProjectItem.spdata, который и является всему виной. Механизм его генерации иногда хромает, выливаясь в различного рода ошибки. Причем, иногда эти ошибки локализовать гораздо сложнее.
Если посмотреть внутренности этого файла, увидим следующее:
<?xml version="1.0" encoding="utf-8"?>
<ProjectItem Type="Microsoft.VisualStudio.SharePoint.Module" DefaultFile="Elements.xml" SupportedTrustLevels="All" SupportedDeploymentScopes="Web, Site" xmlns="http://schemas.microsoft.com/VisualStudio/2010/SharePointTools/SharePointProjectItemModel">
  <Files>
    <ProjectItemFile Source="Elements.xml" Target="Module2\" Type="ElementManifest" />
    <ProjectItemFile Source="Sample2.txt" Target="Module2\" Type="ElementFile" />
    <ProjectItemFile Source="Module2\Sample1.txt" Target="Module2\" Type="ElementFile" />
  </Files>
</ProjectItem>
Как вы уже наверняка догадались, нужно подправить одну строчку:
<ProjectItemFile Source="Module2\Sample1.txt" Target="Module2\" Type="ElementFile" />
После редактирования этого файла, вернувшись в студию, нажмем "Да" в ответ на предупреждение об изменении файла:



Пробуем деплоить... Deploy succeeded!

Резюме

Всегда нужно помнить, что в студии тоже полно багов. А скрытые из солюшена файлы - это потенциальный источник скрытых багов, которые очень сложно вычислить. Так что, проверяйте файлики .spdata, и будет вам счастье!

P.S. Описанное относится к Microsoft Visual Studio 2010 SharePoint Developer Tools 10.0.30319. В более новых версиях SPDT может уже и исправлено, не знаю.

4 комментария:

  1. Ещё был косяк при смене пространства имён в классе веб-части. Тогда в генерируемом манифесте в секции SafeControl оставалось старое пространство. Исправляется это редактированием одного из xml-файлов проекта, соответствующего веб-части (не помню, как называется файл).

    ОтветитьУдалить
  2. А, кстати, SharePointProjectItem.spdata и называется :)

    ОтветитьУдалить
  3. :)))
    Да, всё зло в них. Причем т.к. они из проекта скрыты, вот новичку ваще ни в жизнь не додуматься, в чем загвоздка.

    Кстати, я пока писал этот пост, седня проект сломал!

    Еще вчера столкнулся с дурацкими багами, после ренейма. Порылся утром, раскопал в чем ошибка, написал пост. В процессе написания, решил еще раз воспроизвести ошибку, ну воспроизвел, потом бац, откатываю изменения назад, деплою солюшн, а он не деплоится. Стал разбираться, интересно же, чо там такое случилось. Долго разбирался, а потом еще на сайт отвлекли - ну в общем так до вечера и не продеплоил :(

    ОтветитьУдалить
  4. хе-хе, так и пришлось из svn восстанавливать) починил)

    ОтветитьУдалить

Внимание! Реклама и прочий спам будут беспощадно удаляться.