我们使用功能将Web.Parts的常见功能部署到SharePoint Server 2010中的样式库,最近我们在部署了更新版本的功能时未更新文件的问题。 (注意:我在这里松散地使用术语“版本” - 我们不是我们的WebParts版本。 在搜索后,我发现这个问题(即,模块将部署文件的初始版本,但不会更新它)已记录在许多博客上。所有的结论是要更新文件,您需要使用FexureCeiver以编程方式进行编程方式。我发现了一些不同的解决方案:

用于沙箱WebPart解决方案:

http:// stefan- stanev-sharepoint-blog.blogspot.com.au/2011/01/automoical oad-publishing-files.html

for farm webpart解决方案:

HTTP://johanleino.wordpress .com / 2009/04 / 22 / howto-handling-file-in-in-sharepoint /

我尝试过两种解决方案,但最终与Johan的解决方案一起使用了一些小调整我们的场景。

当我ran johan的代码时遇到了nullreferenceException,但这是因为我们的模块元素上没有路径属性。 我替换了呼叫以检索路径属性用呼叫检索URL属性。 然后我遇到了以下错误:

The URL ‘[url]‘ is invalid. It may refer to a nonexistent file or folder, or refer to a valid file or folder that is not in the current Web
.

我发现了各种不同的博客概述了这个错误的解决方案,但没有人为我解决了它:

*链接删除,因为我只是一个不能发布超过2个链接的矮小的新手;)*

是否有没有其他任何建议从日志上?

注意:我们正在使用农场解决方案,而不是沙箱解决方案。

有帮助吗?

解决方案

After doing a lot of reading and after debugging the feature receiver, I discovered two things:

  1. One of our files (which was introduced after the original version was deployed but before the current version) didn't exist in the Style Library on the SharePoint site. i.e. it had never been deployed. I checked a couple of our test servers and the file wasn't there either so this confirmed it wasn't isolated to my dev machine. This "missing" file was the file throwing the Invalid URL error when SPWeb.Files.Add was called. I confirmed that the file did exist in the hive and that the Add method could create new files. I had a look at what SPWeb.GetFile() was returning. Interestingly enough, the SPFile object returned when retrieving the "virtual file" had Exists = true... but... the file doesn't exist on the server??? (Interesting post here on SPWeb.GetFile(): http://blog.mastykarz.nl/inconvenient-spwebgetfilestring/). I switched to using GetFileOrFolder() and casting to SPFile but my problem still wasn't resolved.

  2. After looking again at Johan's code, I decided to see if there was something else in the call to Add that could be causing an issue. I re-examined our elements.xml file to see if the entry for the "missing" file was different from the other file entries. This ended up being where my problem was... the entry for the "missing" file didn't have all of the attributes that other entries had. In particular, it was missing the Type and IgnoreIfExists attributes.

    <File Path="Style Library\Assets\Scripts\JQuery\JQueryDollarFix.js" Url="Assets/Scripts/JQuery/JQueryDollarFix.js" />
    

    I updated the entry to be:

    <File Path="Style Library\Assets\Scripts\JQuery\JQueryDollarFix.js" Url="Assets/Scripts/JQuery/JQueryDollarFix.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="True"/>
    

    I re-deployed the wsp to the SharePoint site and activated the feature. The FeatureReceiver code ran successfully and the files were updated and checked into the Style Library.

    Feature Receiver Properties Extension (I put this in its own class in the same project as the feature):

    using System.Collections;
    using System.Globalization;
    using System.IO;
    using System.Linq;
    using System.Xml.Linq;
    
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Administration;
    
    /// <summary>
    /// Extension methods for SPFeatureReceiverProperties
    /// </summary>
    public static class SPFeatureReceiverPropertiesExtension
    {
        /// <summary>
        /// Updates the files in module.
        /// </summary>
        /// <param name="instance">The instance.</param>
        public static void UpdateFilesInModule(this SPFeatureReceiverProperties instance)
        {
            var modules = (from SPElementDefinition element in instance.Feature.Definition.GetElementDefinitions(CultureInfo.CurrentCulture)
                           where element.ElementType == "Module"
                           let xmlns = XNamespace.Get(element.XmlDefinition.NamespaceURI)
                           let module = XElement.Parse(element.XmlDefinition.OuterXml)
                           select new
                               {
                                   Url = module.Attribute("Url").Value,
                                   Path = Path.Combine(element.FeatureDefinition.RootDirectory, module.Attribute("Url").Value), // don't have a Path attribute on our Module so changed Path to URL
                                   Files = (from file in module.Elements(xmlns.GetName("File"))
                                            select new
                                                {
                                                    Url = file.Attribute("Url").Value,
                                                    Properties = (from property in file.Elements(xmlns.GetName("Property"))
                                                                  select property).ToDictionary(
                                                                      n => n.Attribute("Name").Value,
                                                                      v => v.Attribute("Value").Value)
                                                }).ToList()
                               }).ToList();
    
            using (SPWeb web = (instance.Feature.Parent as SPSite).OpenWeb())
            {
                modules.ForEach(module =>
                    {
                        module.Files.ForEach(file =>
                            {
                                string hivePath = Path.Combine(module.Path, file.Url); // in 14-hive
                                string virtualPath = string.Concat(web.Url, "/", module.Url, "/", file.Url); // in SPFS
    
                                if (File.Exists(hivePath))
                                {
                                    using (StreamReader streamReader = new StreamReader(hivePath))
                                    {
                                        object obj = web.GetFileOrFolderObject(virtualPath);
    
                                        if (obj is SPFile)
                                        {
                                            SPFile virtualFile = (SPFile)obj;
                                            bool checkOutEnabled = virtualFile.Item == null
                                                                       ? virtualFile.ParentFolder.Item.ParentList.
                                                                             ForceCheckout
                                                                       : virtualFile.Item.ParentList.ForceCheckout;
                                            bool needsApproval = virtualFile.Item == null
                                                                     ? virtualFile.ParentFolder.Item.ParentList.
                                                                           EnableModeration
                                                                     : virtualFile.Item.ParentList.EnableModeration;
    
                                            if (checkOutEnabled)
                                            {
                                                if (virtualFile.CheckOutType != SPFile.SPCheckOutType.None)
                                                {
                                                    virtualFile.UndoCheckOut();
                                                }
                                                virtualFile.CheckOut();
                                            }
    
                                            virtualFile = web.Files.Add(
                                                virtualPath,
                                                streamReader.BaseStream,
                                                new Hashtable(file.Properties),
                                                true);
    
                                            if (checkOutEnabled)
                                            {
                                                virtualFile.CheckIn(
                                                    "Checked in by deployment.", SPCheckinType.MajorCheckIn);
                                            }
    
                                            if (needsApproval)
                                            {
                                                virtualFile.Approve("Approved by deployment.");
                                            }
    
                                            virtualFile.Update();
                                        }
                                    }
                                }
                            });
                    });
            }
        }
    }
    

An excerpt of the elements.xml file for our Module:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="Style Library" Url="Style Library">
    <File Path="Style Library\Assets\Scripts\JQuery\UI\jquery-ui-1.8.16.custom.js" Url="Assets/Scripts/JQuery/UI/jquery-ui-1.8.16.custom.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Scripts\JQuery\UI\jquery-ui-1.8.16.custom.min.js" Url="Assets/Scripts/JQuery/UI/jquery-ui-1.8.16.custom.min.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Resources\search.png" Url="Assets/Resources/search.png" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Scripts\Common.js" Url="Assets/Scripts/Common.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />   
    <File Path="Style Library\Assets\Styles\Common.css" Url="Assets/Styles/Common.css" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Styles\Pager.css" Url="Assets/Styles/Pager.css" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Styles\sharepoint.theme.overrides.css" Url="Assets/Styles/sharepoint.theme.overrides.css" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Scripts\JQuery\JQueryDollarFix.js" Url="Assets/Scripts/JQuery/JQueryDollarFix.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="True"/>
    <File Path="Style Library\Assets\Styles\images\arrow.gif" Url="Assets/Styles/images/arrow.gif" Type="GhostableInLibrary" IgnoreIfAlreadyExists="True"/>
  </Module>
</Elements>

Useful links:

* Removed as unable to add more than 2 links *

许可以下: CC-BY-SA归因
scroll top