我有一个Asp.Net网站(没有.csproj文件)。
本网站的源代码由SVN控制。
我从源代码管理中排除了bin文件夹。
所有外部程序集都是从我的SVN根目录下的DLL文件夹引用的。
我尝试使用cruisecontrol.net部署此网站。
问题:
Cruise control从subversion加载所有文件,它对.sln文件运行msbuild.exe。这会导致错误:无法找到外部程序集(因为不包括bin文件夹)。
到目前为止我找到的解决方案:
在我的msbuild任务之前,从我的源代码控制器到/ bin文件夹执行dll的robocopy。
还有其他解决方案吗? (每次我将外部程序集添加到项目中时,我都不想编辑配置。)
编辑:
我最后使用的是“刷新文件”技术,这是我用来创建它们的程序
class Program
{
private const string PATH_BIN = @"F:\WebSite\bin\";
private const string PATH_REFERENCE = @"C:\DLL\";
static void Main(string[] args)
{
foreach (string aFile in Directory.GetFiles(PATH_BIN))
{
if(!aFile.EndsWith(".dll"))
continue;
string pathRefreshFile = aFile + ".refresh";
if(File.Exists(pathRefreshFile))
continue;
string referenceFilePath = PATH_REFERENCE+Path.GetFileName(aFile);
if (!File.Exists(referenceFilePath))
continue;
using (StreamWriter sw = new StreamWriter(pathRefreshFile))
{
sw.Write(referenceFilePath);
}
}
}
}
答案 0 :(得分:1)
我假设您拥有第三方的.dll文件,而不是您可以包含在解决方案中并添加为项目参考的类库项目创建的文件。我们有类似的方案,例如Microsoft Anti-Xss库和我们在几乎所有网络应用程序中引用的其他常见第三方.dll。
不要排除\ bin目录,而是排除* .dll。这样,当您添加对.dll的引用时,Visual Studio会将.dll添加到\ bin目录并将 .dll.refresh 文件添加到\ bin目录。
That.Refresh文件告诉Visual Studio从哪里获取.dll文件。只要原始.dll位于该位置,那么您应该能够在构建服务器上或在全新开发人员的PC上构建。
例如,我们在源代码管理中有一个\ shared \ commonDlls目录,其中.dlls被检入源代码控制。
我们所有其他应用都会在需要时引用这些应用。只要签入这些内容,当构建服务器构建您的项目时,它就会知道要将\ _共享\ commonDlls目录复制到该文件中。
这使我们能够拥有.dll文件的一个主源,这样我们就无需在升级时将其复制到几十个不同的Web应用程序中。我们将它放入我们的共享\ commonDlls目录(覆盖原始目录),将其签入,我们所有的网络应用程序现在都使用最新版本。
编辑 - 添加 - 链接到与此答案相关的相关主题的答案:
How manage references in SVN/Visual Studio?
Best Practice: Collaborative Environment, Bin Directory, SVN
编辑 - 添加 - 我们的ccnet.config文件中指向.sln文件的部分
这可能不需要,但是因为我在下面的评论中提到了.sln文件,我以为我会添加它。
<msbuild>
<description>DonationRequests</description>
<workingDirectory>D:\dev\svn\trunk\Intranet\DonationRequests</workingDirectory>
<executable>C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable>
<projectFile>DonationRequests.sln</projectFile>
<buildArgs>/p:Configuration=Debug /v:diag</buildArgs>
<timeout>900</timeout>
<logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>