跨不同程序集的ASP.NET可重用用户控件

时间:2014-08-29 16:37:10

标签: c# asp.net msbuild msbuild-target

我们目前正在开发多个Web项目,并希望能够创建一个项目,其中包括跨Web项目共享的用户控件,而不必重新创建它们。根据我的发现,整个过程is a pain因为每个项目都需要访问实际的ascx文件,而不仅仅是对它的引用。

我接近这个的方法是:

1-使用预构建事件复制.ascx文件

从共享程序集到当前项目的工作文件夹。这适用于调试应用程序,但我们需要在文件系统发布期间执行相同的操作。

2-使用MSBuild目标复制发布

的.ascx文件

我将以下目标添加到项目的配置文件中:

<Target Name="AfterPublish" AfterTargets="PipelinePreDeployCopyAllFilesToOneFolder">
   <Exec Command="xcopy.exe SourcePath OutputPath" />
</Target>

(请注意,SourcePathTargetPath是目录的完整路径。我在这里替换它们以缩短它们。

在文件系统发布(右键单击项目 - &gt;发布)后调用此目标,但是,文件不会被复制到目标文件夹。

我确认已调用目标(通过更改Command=explorer.exe,弹出Windows资源管理器窗口),并在{{1}上运行xcopy.exe命令,其路径相同它确实工作得很好。所以我不明白为什么它不能作为目标的一部分。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可能必须检查发布选项并确保“在发布之前删除所有现有文件” Publish Options

问题是xcopy命令总是在删除发生之前执行,所以它们会被复制但是会在之后删除。

如果您每次我建议您将所有内容放入“AfterBuild”

时需要一个干净的文件夹
<Target Name="AfterBuild">

<Exec Command="echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Clean Publish Folder @@@@@@@@@@@@@@@@@@@@@@@@@@@@" />
<Exec Command="echo $(PublishUrl)" />
<Exec Command="echo Publish Folder Deleted...." Condition="Exists('$(PublishUrl)')"/>
<!--<Exec Command="del /q $(PublishUrl)\*" Condition="Exists('$(PublishUrl)')"/>-->
<!--<Exec Command="FOR /D %%p IN (&quot;$(PublishUrl)*.*&quot;) DO rmdir &quot;%%p&quot; /s /q" />-->
<Exec Command="del /q $(PublishUrl)\*" Condition="Exists('$(PublishUrl)')"/>
<Exec Command="FOR /D %%p IN (&quot;$(PublishUrl)\*.*&quot;) DO rmdir &quot;%%p&quot; /s /q" />
<Exec Command="echo Publish Folder Creation...." Condition="Exists('$(PublishUrl)')"/>
<Exec Command="mkdir $(PublishUrl)" Condition="!Exists('$(PublishUrl)')"/>
<Exec Command="echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Copying @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" />
<Exec Command="xcopy.exe SourceDir DestinationDir /S /E /H" />

</Target>

答案 1 :(得分:0)

MSBuild有一个复制任务。请尝试以下方法:

<Target Name="AfterBuild">
  <ItemGroup>
    <MySource Include='path\to\files\**\*.*" />
  </ItemGroup>
  <Copy SourceFiles="@(MySource)" DestinationFolder="$(OutputDir)\%(RecursiveDir)" />
</Target>