Задача AspNetCompiler в проекте SharePoint

#asp.net #sharepoint #sharepoint-2010 #aspnet-compiler

#asp.net #sharepoint #sharepoint-2010 #aspnet-компилятор

Вопрос:

Я хотел бы знать, как скомпилировать файлы aspx после сборки в решении sharepoint, чтобы увидеть ошибки во время выполнения, например, отсутствие ресурса (при переводе страницы с использованием ресурсов).

Когда я добавляю задачу AspNetCompiler в свой csproj следующим образом (отображается только конец файла проекта):

 ...
<PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)MicrosoftVisualStudiov$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>
  <Import Project="$(VSToolsPath)SharePointToolsMicrosoft.VisualStudio.SharePoint.targets" Condition="'$(VSToolsPath)' != ''" />
  <Target Name="AfterBuild">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)" />
    <!-- ToolPath="C:WindowsMicrosoft.NETFramework64v2.0.50727" -->
  </Target>
  <PropertyGroup>
    <PostBuildEvent>
    </PostBuildEvent>
  </PropertyGroup>
</Project>
  

затем при сборке проекта я получаю следующую ошибку в файле aspx:

 Could not load file or assembly '$SharePoint.Project.AssemblyFullName$' or one of its dependencies. The system cannot find the file specified.
  

Очевидно, что компилятор asp пытается создать файлы aspx в каталоге проекта, в которых не заменены токены. Однако мне не удалось завершить задачу, чтобы она работала на полях с замененными токенами. Мои знания MSBuild ограничены, что может быть проблемой.

Ответ №1:

Единственный способ выполнить замену токена — создать пакет wsp, поскольку замена происходит там. Затем решение состоит в том, чтобы создать wsp, распаковать его в целевую папку, создать там новый каталог с именем «bin», переместить библиотеки DLL в каталог bin, а затем запустить компилятор aspnet в целевой папке. Весь процесс можно выполнить в файле MSBuild (csproj). Это мое решение — в конце файла csproj, после импорта целевых объектов sharepoint:

   <Import Project="$(VSToolsPath)SharePointToolsMicrosoft.VisualStudio.SharePoint.targets" Condition="'$(VSToolsPath)' != ''" />
  <PropertyGroup>
    <!-- schedule creating the package in the build, the task is defined in sharepoint targets -->
    <BuildDependsOn>$(BuildDependsOn);CreatePackage</BuildDependsOn>
    <PostBuildEvent>
    </PostBuildEvent>

    <!-- define file/folder properties -->
    <ExpandDest>$(TargetDir)_wsp</ExpandDest>
    <WspBinPath>$(ExpandDest)bin</WspBinPath>
    <WspPath>$(TargetDir)MyProject.wsp</WspPath>    
  </PropertyGroup>

  <!-- override "after build" target, it must depend on the package creation, 
       which ensures that the target runs after we have the wsp package ready -->
  <Target Name="AfterBuild" DependsOnTargets="CreatePackage">
    <!-- create the folder where we unpack our wsp -->
    <MakeDir Directories="$(ExpandDest)" />    
    <!-- use expand to unpack the wsp -->
    <Message Text="$(ExpandWsp)" Importance="high" />
    <Exec Command="expand amp;quot;$(WspPath)amp;quot; -F:* amp;quot;$(ExpandDest)amp;quot;" />

    <!-- create the "bin" folder -->
    <MakeDir Directories="$(WspBinPath)" />
    <!-- move all dlls and xmls from the root to the bin folder -->
    <Exec Command="move /Y amp;quot;$(ExpandDest)*.dllamp;quot; amp;quot;$(WspBinPath)amp;quot;" />
    <Exec Command="move /Y amp;quot;$(ExpandDest)*.xmlamp;quot; amp;quot;$(WspBinPath)amp;quot;" />

    <!-- run the aspnet compiler on the wsp folder,
         the tool path param ensures that .net 2 compiler will be used,
         we need that because we compile sharepoint 2010 which is .net 3.5
         and the latest aspnet compiler for .net 3.5 is in .net 2 -->
    <AspNetCompiler 
      VirtualPath="/"
      PhysicalPath="$(ExpandDest)"
      Clean="true"
      ContinueOnError="false"
      ToolPath="C:WindowsMicrosoft.NETFrameworkv2.0.50727" />
  </Target>
</Project>
  

РЕДАКТИРОВАТЬ: процесс немного сложнее. В соответствии с вашим собственным проектом вам необходимо переместить некоторые файлы в определенные папки. В принципе, следуйте тому, что вам говорит компилятор.

Ответ №2:

Как вы, вероятно, знаете, необходимые файлы уже скопированы (как часть процесса упаковки в Visual Studio) в папку перед созданием файла wsp, и вы можете легко указать на эту папку, поэтому нет необходимости выполнять все эти операции создания, перемещения и извлечения папок. Таким образом, лучшим решением IMHO было бы использовать только следующее:

 <Target Name="AfterBuild" DependsOnTargets="CreatePackage">
    <Message Text="Validating Asp.Net files (PhysicalPath: $(LayoutPath), ToolPath: $(FrameworkDir)$(FrameworkVersion))..." Importance="high" />
    <AspNetCompiler 
        VirtualPath="/" 
        PhysicalPath="$(LayoutPath)" 
        Clean="true" ContinueOnError="false" 
        ToolPath="$(FrameworkDir)$(FrameworkVersion)" />
    <Message Text="Asp.Net validation is complete" Importance="high" />