2012-10-12 67 views
6

我在使用节点缩小和连接javascript文件的Web项目上有一个预生成事件。这会在脚本文件夹中创建一个名为BuiltScripts的文件夹,该文件夹是脚本文件夹的副本,但文件被缩小。当我进行部署时,我想发布包含BuiltScripts文件夹的脚本文件夹。为了实现这一点,我已经将BuiltScripts文件夹添加到项目中。这不是一个理想的解决方案,因为:MSBuild:部署未包含在项目中的文件

  1. 我必须检出BuiltScripts文件夹才能构建,因为其中的文件是只读的,因为解决方案是在源代码控制之下。因为我检出了很多文件,所以在签入时会造成麻烦。
  2. 当我向项目中添加一个新文件时,我必须确保记得将它添加到BuiltScripts文件夹中,否则将不会部署该文件的内置版本。
  3. 我的构建将在构建服务器上失败,因为BuiltScripts文件夹中的文件也只能在这里读取。
  4. 在搜索文件和执行基于文本的搜索时,遇到两个具有相同名称的文件副本是个问题。

我想构建服务器构建和minifi JavaScript文件作为预构建步骤,但我不想将BuiltScripts文件夹添加到项目。但是,当构建服务器将项目打包到最后时,我希望它将BuildScripts文件夹与构建过程的输出一起复制。我怎样才能做到这一点?

+0

你用什么来部署\发布 - 这是标准的msbuild目标或你做了一些自定义? –

+0

@AlexeyShcherbak MSBuild,TFS,自定义 –

+0

我怀疑Sayed Ibrahim Hashimi在回答你的问题后写了这篇文章:)。 http://sedodream.com/2012/10/09/VSWebPublishHowToIncludeFilesOutsideOfTheProjectToBePublished.aspx –

回答

5

而不是使用项目属性的预生成事件(我认为是你的意思),重写.csproj/.vbproj文件中的BeforeBuild目标。

<Project ...> 
    ... 
    <Target Name="BeforeBuild"> 
    <!-- Create the 'BuildScripts' directory. --> 
    <!-- The $(IntermediateOutputPath) reference the 'obj' folder, which I like to --> 
    <!-- use for these kinds of things. --> 
    <MakeDir Directories="$(IntermediateOutputPath)BuiltScripts"> 
     <Output PropertyName="BuildScriptsPath" TaskParameter="DirectoriesCreated" /> 
    </MakeDir> 
    <!-- Execute the javascript minifier. --> 
    <Exec Command="..." /> 
    <!-- Create an item group for the minified scripts so we manipulate the target path. --> 
    <CreateItem Include="$(BuildScriptsPath)\*.js"> 
     <Output ItemName="BuiltScripts" TaskParameter="Include" /> 
     <Output ItemName="FileWrites" TaskParameter="Include" /> 
    </CreateItem> 
    <!-- Add the minified scripts to the Content item group, --> 
    <!-- which the deployment MSBuild inspects for files to deploy. --> 
    <CreateItem Include="@(BuiltScripts)" 
     AdditionalMetadata="TargetPath=scripts\%(Filename)%(Extension)"> 
     <Output ItemName="ContentWithTargetPath" TaskParameter="Include" /> 
    </CreateItem> 
    </Target> 
    ... 
</Project> 

您可能必须与该是CreateItem任务的输出,如果文件没有部署到正确的目录内容项目组的形状玩。请注意,我使用了一个项目转换来制作目标路径scripts\YourScript.js

另请注意,第一个CreateItem任务将输出填充到名为“FileWrites”的项目组中。我发现Clean目标检查该项目组以知道要删除的文件。

将XML放入您的项目文件<Import>元素,你应该很好去。不需要签入源代码控制,甚至你的构建服务器也会很开心。

+0

你会添加一个步骤来删除以前的BuiltScripts文件夹内容吗? –

+0

我运行我的示例代码,它看起来像IncrementalClean目标将自动删除文件,因为它们包含在FileWrites项目组中,这在您删除.js文件并且您不希望它再被部署时很有用。 – Matt

0

难道你不能使用后生成事件来运行脚本来做你想做的事吗?我用一个将我的输出文件移动到与项目完全无关的位置。无论是简单批处理,VBScript/JScript还是PowerShell,您都可以做任何您想做的事情。

0

我有类似的需求,尽管它只涉及将现有文件添加到部署包而不是生成它们作为构建的一部分。我发现this page的技术很有用。

相关问题