Skip to content

Commit 8dbaa84

Browse files
committed
[Xamarin.Android.Build.Tasks] Path is too long
Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=30147 Windows (still) has a max path limit of 260 characters.. This can cause us a problem if the user creates a project in a directory which already takes up most of that limit.. Like on their Desktop! This is because of the intermediate structure that was introduced to handle embedding resources into the assemblies. The current intermediate structure is as follows `$(IntermediateOutputPath)\__library_project_imports__\$(AssemblyName)\library_project_imports\` `$(IntermediateOutputPath)\__library_project_imports__\$(AssemblyName)\native_library_imports\` Now consider that `$(AssemblyName)` can sometimes end up with something lile "Xamarin.Android.Support.v7.AppCompat.21.0.3.0" you can easily see how we start getting into trouble. There was an attempt to fix this up a while ago (722dcc05) by introducing the `$(UseShortFileNames)` property. However while this did introduce a directory structure which was shorter is broke backwards compatability with older versions of xamarin-android. This is because of the structore of the zip files we that are embedded into the assemblies. The current system just extracts the zip into the `$(IntermediateOutputPath)\__library_project_imports__\$(AssemblyName)\` directory and assumes that it contains a `library_project_imports` directory. All the build tasks also assumed that as well. So the fix needs to be done on a number of fronts. Firstly we need to update the `$(_LibraryProjectImportsDirectoryName)` and `$(_NativeLibraryImportsDirectoryName)` to be something shorter. Next up we need to shorten "__library_project_imports__" to something else verbose as well. This should cut down on the amount of the MAX_PATH we chew up. The real key to this is to NOT change the structure of the zip files in the assemblies! So when we generate a zip from "jlibs" we make sure that the folder in the zip is called "library_project_imports". And when we extract the zip file we makle sure that "library_project_imports" is replaced by the shorter name. This will ensure that we are backward compatbile with older versions BUT more importantly we get to use the shorter directory structure. The files for native librarys are not extracted to disk but are extracted from memory so as long as the structure remains the same i.e "native_library_imports" that code does not need to change. The other thing we need to do is to update ResolveLibraryProjectImports Task to upgrade the system when it runs. So if we already have a "libraryprojectimports.cache" in place we just use that as is. But if we re-run the ResolveLibraryProjectImports task (due to a change or a clean build) we detect if we have the older structure in place and just remove it.. Since we are going to regenerate the entire cache again anyway we might as well start from scratch. With this in place it becomes possible we can now enable `$(UseShortFileNames)` by default! So the new structure that is created is as follows `$(IntermediateOutputPath)\lp\<id>\jl` `$(IntermediateOutputPath)\lp\<id>\nl` The <id> will be a single integer value which can be mapped to the source assembly via a new map.cache file. This .cache file will contain a list of assemblys. We use the `Index` of the assembly in the list to figure out which cache directory to use. UnnamedProject Library1 In this case `Library1` would have an index of `1` and `UnnamedProject` will be `0`. The old behaviour can be enabled by setting `$(UseShortFileNames)` to `False`. Note in order to keep existing bindings generator behaviour consistent, the BindingsGenerator task will not use the `$(UseShortFileNames)` property to control how it generates its .cs files. Instead a new property `$(UseShortGeneratorFileNames)` which can be used to control if the generator produces short names (e.g 1.cs, 2.cs). This will be `False` by default.
1 parent 1ea5f07 commit 8dbaa84

14 files changed

+273
-136
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/Aapt.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,14 @@ public class Aapt : AsyncTask
7171
public string ImportsDirectory { get; set; }
7272
public string OutputImportDirectory { get; set; }
7373
public bool UseShortFileNames { get; set; }
74+
public string AssemblyIdentityMapFile { get; set; }
7475

7576
public string ResourceNameCaseMap { get; set; }
7677

7778
public bool ExplicitCrunch { get; set; }
7879

7980
Dictionary<string,string> resource_name_case_map = new Dictionary<string,string> ();
81+
AssemblyIdentityMap assemblyMap = new AssemblyIdentityMap ();
8082

8183
bool ManifestIsUpToDate (string manifestFile)
8284
{
@@ -197,6 +199,8 @@ public override bool Execute ()
197199
foreach (var arr in ResourceNameCaseMap.Split (';').Select (l => l.Split ('|')).Where (a => a.Length == 2))
198200
resource_name_case_map [arr [1]] = arr [0]; // lowercase -> original
199201

202+
assemblyMap.Load (AssemblyIdentityMapFile);
203+
200204
ThreadingTasks.Parallel.ForEach (ManifestFiles, () => 0, DoExecute, (obj) => { Complete (); });
201205

202206
base.Execute ();
@@ -315,7 +319,7 @@ string ExpandString (string s)
315319
return s.Substring (0, st + 1) + ExpandString (s.Substring (st + 1));
316320
int ast = st + "${library.imports:".Length;
317321
string aname = s.Substring (ast, ed - ast);
318-
return s.Substring (0, st) + Path.Combine (OutputImportDirectory, UseShortFileNames ? MonoAndroidHelper.GetLibraryImportDirectoryNameForAssembly (aname) : aname, ImportsDirectory) + Path.DirectorySeparatorChar + ExpandString (s.Substring (ed + 1));
322+
return s.Substring (0, st) + Path.Combine (OutputImportDirectory, UseShortFileNames ? assemblyMap.GetLibraryImportDirectoryNameForAssembly (aname) : aname, ImportsDirectory) + Path.DirectorySeparatorChar + ExpandString (s.Substring (ed + 1));
319323
}
320324
else
321325
return s;

src/Xamarin.Android.Build.Tasks/Tasks/CreateLibraryResourceArchive.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public override bool Execute ()
9494

9595
if (Files.ArchiveZip (outpath, f => {
9696
using (var zip = new ZipArchiveEx (f)) {
97-
zip.AddDirectory (OutputDirectory, outDirInfo.Name);
97+
zip.AddDirectory (OutputDirectory, "library_project_imports");
9898
}
9999
})) {
100100
Log.LogDebugMessage ("Saving contents to " + outpath);

src/Xamarin.Android.Build.Tasks/Tasks/CreateManagedLibraryResourceArchive.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public override bool Execute ()
108108

109109
if (Files.ArchiveZip (outpath, f => {
110110
using (var zip = new ZipArchiveEx (f)) {
111-
zip.AddDirectory (OutputDirectory, outDirInfo.Name);
111+
zip.AddDirectory (OutputDirectory, "library_project_imports");
112112
}
113113
})) {
114114
Log.LogDebugMessage ("Saving contents to " + outpath);

src/Xamarin.Android.Build.Tasks/Tasks/CreateNativeLibraryArchive.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public override bool Execute ()
6666

6767
if (Files.ArchiveZip (outpath, f => {
6868
using (var zip = new ZipArchiveEx (f)) {
69-
zip.AddDirectory (OutputDirectory, outDirInfo.Name);
69+
zip.AddDirectory (OutputDirectory, "native_library_imports");
7070
}
7171
})) {
7272
Log.LogDebugMessage ("Saving contents to " + outpath);

src/Xamarin.Android.Build.Tasks/Tasks/ResolveLibraryProjectImports.cs

Lines changed: 104 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ public class ResolveLibraryProjectImports : Task
3434
[Required]
3535
public bool UseShortFileNames { get; set; }
3636

37+
[Required]
38+
public string AssemblyIdentityMapFile { get; set; }
39+
3740
public string CacheFile { get; set;}
3841

3942
[Output]
@@ -51,13 +54,14 @@ public class ResolveLibraryProjectImports : Task
5154
[Output]
5255
public ITaskItem [] ResolvedResourceDirectoryStamps { get; set; }
5356

54-
string imports_dir = "library_project_imports";
57+
AssemblyIdentityMap assemblyMap = new AssemblyIdentityMap();
5558

5659
public ResolveLibraryProjectImports ()
5760
{
5861
}
5962

6063
// Extracts library project contents under e.g. obj/Debug/[__library_projects__/*.jar | res/*/*]
64+
// Extracts library project contents under e.g. obj/Debug/[lp/*.jar | res/*/*]
6165
public override bool Execute ()
6266
{
6367
Log.LogDebugMessage ("ResolveLibraryProjectImports Task");
@@ -72,6 +76,8 @@ public override bool Execute ()
7276
var resolvedAssetDirectories = new List<string> ();
7377
var resolvedEnvironmentFiles = new List<string> ();
7478

79+
assemblyMap.Load (AssemblyIdentityMapFile);
80+
7581
using (var resolver = new DirectoryAssemblyResolver (Log.LogWarning, loadDebugSymbols: false)) {
7682
Extract (resolver, jars, resolvedResourceDirectories, resolvedAssetDirectories, resolvedEnvironmentFiles);
7783
}
@@ -112,6 +118,8 @@ public override bool Execute ()
112118
document.Save (CacheFile);
113119
}
114120

121+
assemblyMap.Save (AssemblyIdentityMapFile);
122+
115123
Log.LogDebugTaskItems (" Jars: ", Jars.Select (s => new TaskItem (s)).ToArray ());
116124
Log.LogDebugTaskItems (" ResolvedResourceDirectories: ", ResolvedResourceDirectories.Select (s => new TaskItem (s)).ToArray ());
117125
Log.LogDebugTaskItems (" ResolvedAssetDirectories: ", ResolvedAssetDirectories.Select (s => new TaskItem (s)).ToArray ());
@@ -135,13 +143,20 @@ static string GetTargetAssembly (ITaskItem assemblyName)
135143
}
136144

137145
// Extracts library project contents under e.g. obj/Debug/[__library_projects__/*.jar | res/*/*]
146+
// Extracts library project contents under e.g. obj/Debug/[lp/*.jar | res/*/*]
138147
void Extract (
139148
DirectoryAssemblyResolver res,
140149
ICollection<string> jars,
141150
ICollection<string> resolvedResourceDirectories,
142151
ICollection<string> resolvedAssetDirectories,
143152
ICollection<string> resolvedEnvironments)
144153
{
154+
// lets "upgrade" the old directory.
155+
string oldPath = Path.GetFullPath (Path.Combine (OutputImportDirectory, "..", "__library_projects__"));
156+
if (!OutputImportDirectory.Contains ("__library_projects__") && Directory.Exists (oldPath)) {
157+
MonoAndroidHelper.SetDirectoryWriteable (Path.Combine (oldPath, ".."));
158+
Directory.Delete (oldPath, recursive: true);
159+
}
145160
var outdir = new DirectoryInfo (OutputImportDirectory);
146161
if (!outdir.Exists)
147162
outdir.Create ();
@@ -154,26 +169,95 @@ void Extract (
154169
.Select (a => GetTargetAssembly (a))
155170
.Where (a => a != null)
156171
.Distinct ()) {
157-
foreach (var imp in new string [] {imports_dir, "library_project_imports"}.Distinct ()) {
158-
string assemblyIdentName = Path.GetFileNameWithoutExtension (assemblyPath);
159-
if (UseShortFileNames) {
160-
assemblyIdentName = Xamarin.Android.Tasks.MonoAndroidHelper.GetLibraryImportDirectoryNameForAssembly (assemblyIdentName);
161-
}
162-
string outDirForDll = Path.Combine (OutputImportDirectory, assemblyIdentName);
163-
string importsDir = Path.Combine (outDirForDll, imp);
172+
string assemblyIdentName = Path.GetFileNameWithoutExtension (assemblyPath);
173+
if (UseShortFileNames) {
174+
assemblyIdentName = assemblyMap.GetLibraryImportDirectoryNameForAssembly (assemblyIdentName);
175+
}
176+
string outDirForDll = Path.Combine (OutputImportDirectory, assemblyIdentName);
177+
string importsDir = Path.Combine (outDirForDll, ImportsDirectory);
178+
#if SEPARATE_CRUNCH
179+
// FIXME: review these binResDir thing and enable this. Eclipse does this.
180+
// Enabling these blindly causes build failure on ActionBarSherlock.
181+
//string binResDir = Path.Combine (importsDir, "bin", "res");
182+
//string binAssemblyDir = Path.Combine (importsDir, "bin", "assets");
183+
#endif
184+
string resDir = Path.Combine (importsDir, "res");
185+
string assemblyDir = Path.Combine (importsDir, "assets");
186+
187+
// Skip already-extracted resources.
188+
var stamp = new FileInfo (Path.Combine (outdir.FullName, assemblyIdentName + ".stamp"));
189+
if (stamp.Exists && stamp.LastWriteTime > new FileInfo (assemblyPath).LastWriteTime) {
190+
Log.LogDebugMessage ("Skipped resource lookup for {0}: extracted files are up to date", assemblyPath);
164191
#if SEPARATE_CRUNCH
165-
// FIXME: review these binResDir thing and enable this. Eclipse does this.
192+
// FIXME: review these binResDir/binAssemblyDir thing and enable this. Eclipse does this.
166193
// Enabling these blindly causes build failure on ActionBarSherlock.
167-
//string binResDir = Path.Combine (importsDir, "bin", "res");
168-
//string binAssemblyDir = Path.Combine (importsDir, "bin", "assets");
194+
if (Directory.Exists (binResDir))
195+
resolvedResourceDirectories.Add (binResDir);
196+
if (Directory.Exists (binAssemblyDir))
197+
resolvedAssetDirectories.Add (binAssemblyDir);
169198
#endif
170-
string resDir = Path.Combine (importsDir, "res");
171-
string assemblyDir = Path.Combine (importsDir, "assets");
199+
if (Directory.Exists (resDir))
200+
resolvedResourceDirectories.Add (resDir);
201+
if (Directory.Exists (assemblyDir))
202+
resolvedAssetDirectories.Add (assemblyDir);
203+
continue;
204+
}
205+
206+
if (Directory.Exists (outDirForDll))
207+
Directory.Delete (outDirForDll, true);
208+
209+
var assembly = res.GetAssembly (assemblyPath);
210+
211+
foreach (var mod in assembly.Modules) {
212+
// android environment files
213+
foreach (var envtxt in mod.Resources
214+
.Where (r => r.Name.StartsWith ("__AndroidEnvironment__", StringComparison.OrdinalIgnoreCase))
215+
.Where (r => r is EmbeddedResource)
216+
.Cast<EmbeddedResource> ()) {
217+
if (!Directory.Exists (outDirForDll))
218+
Directory.CreateDirectory (outDirForDll);
219+
var finfo = new FileInfo (Path.Combine (outDirForDll, envtxt.Name));
220+
using (var fs = finfo.Create ()) {
221+
var data = envtxt.GetResourceData ();
222+
fs.Write (data, 0, data.Length);
223+
}
224+
resolvedEnvironments.Add (finfo.FullName);
225+
}
226+
227+
// embedded jars (EmbeddedJar, EmbeddedReferenceJar)
228+
var resjars = mod.Resources
229+
.Where (r => r.Name.EndsWith (".jar", StringComparison.InvariantCultureIgnoreCase))
230+
.Select (r => (EmbeddedResource) r);
231+
foreach (var resjar in resjars) {
232+
var data = resjar.GetResourceData ();
233+
if (!Directory.Exists (importsDir))
234+
Directory.CreateDirectory (importsDir);
235+
using (var outfs = File.Create (Path.Combine (importsDir, resjar.Name)))
236+
outfs.Write (data, 0, data.Length);
237+
}
172238

173-
// Skip already-extracted resources.
174-
var stamp = new FileInfo (Path.Combine (outdir.FullName, assemblyIdentName + ".stamp"));
175-
if (stamp.Exists && stamp.LastWriteTime > new FileInfo (assemblyPath).LastWriteTime) {
176-
Log.LogDebugMessage ("Skipped resource lookup for {0}: extracted files are up to date", assemblyPath);
239+
// embedded AndroidResourceLibrary archive
240+
var reszip = mod.Resources.FirstOrDefault (r => r.Name == "__AndroidLibraryProjects__.zip") as EmbeddedResource;
241+
if (reszip != null) {
242+
if (!Directory.Exists (outDirForDll))
243+
Directory.CreateDirectory (outDirForDll);
244+
var finfo = new FileInfo (Path.Combine (outDirForDll, reszip.Name));
245+
using (var fs = finfo.Create ()) {
246+
var data = reszip.GetResourceData ();
247+
fs.Write (data, 0, data.Length);
248+
}
249+
250+
// temporarily extracted directory will look like:
251+
// __library_projects__/[dllname]/[library_project_imports | jlibs]/bin
252+
using (var zip = MonoAndroidHelper.ReadZipFile (finfo.FullName)) {
253+
Files.ExtractAll (zip, outDirForDll, modifyCallback: (entryFullName) => {
254+
return entryFullName.Replace ("library_project_imports", ImportsDirectory);
255+
});
256+
}
257+
258+
// We used to *copy* the resources to overwrite other resources,
259+
// which resulted in missing resource issue.
260+
// Here we replaced copy with use of '-S' option and made it to work.
177261
#if SEPARATE_CRUNCH
178262
// FIXME: review these binResDir/binAssemblyDir thing and enable this. Eclipse does this.
179263
// Enabling these blindly causes build failure on ActionBarSherlock.
@@ -186,80 +270,13 @@ void Extract (
186270
resolvedResourceDirectories.Add (resDir);
187271
if (Directory.Exists (assemblyDir))
188272
resolvedAssetDirectories.Add (assemblyDir);
189-
continue;
190-
}
191-
192-
if (Directory.Exists (outDirForDll))
193-
Directory.Delete (outDirForDll, true);
194-
195-
Directory.CreateDirectory (importsDir);
196-
197-
var assembly = res.GetAssembly (assemblyPath);
198-
199-
foreach (var mod in assembly.Modules) {
200-
// android environment files
201-
foreach (var envtxt in mod.Resources
202-
.Where (r => r.Name.StartsWith ("__AndroidEnvironment__", StringComparison.OrdinalIgnoreCase))
203-
.Where (r => r is EmbeddedResource)
204-
.Cast<EmbeddedResource> ()) {
205-
if (!Directory.Exists (outDirForDll))
206-
Directory.CreateDirectory (outDirForDll);
207-
var finfo = new FileInfo (Path.Combine (outDirForDll, envtxt.Name));
208-
using (var fs = finfo.Create ()) {
209-
var data = envtxt.GetResourceData ();
210-
fs.Write (data, 0, data.Length);
211-
}
212-
resolvedEnvironments.Add (finfo.FullName);
213-
}
214273

215-
// embedded jars (EmbeddedJar, EmbeddedReferenceJar)
216-
var resjars = mod.Resources
217-
.Where (r => r.Name.EndsWith (".jar", StringComparison.InvariantCultureIgnoreCase))
218-
.Select (r => (EmbeddedResource) r);
219-
foreach (var resjar in resjars) {
220-
var data = resjar.GetResourceData ();
221-
using (var outfs = File.Create (Path.Combine (importsDir, resjar.Name)))
222-
outfs.Write (data, 0, data.Length);
223-
}
224-
225-
// embedded AndroidResourceLibrary archive
226-
var reszip = mod.Resources.FirstOrDefault (r => r.Name == "__AndroidLibraryProjects__.zip") as EmbeddedResource;
227-
if (reszip != null) {
228-
if (!Directory.Exists (outDirForDll))
229-
Directory.CreateDirectory (outDirForDll);
230-
var finfo = new FileInfo (Path.Combine (outDirForDll, reszip.Name));
231-
using (var fs = finfo.Create ()) {
232-
var data = reszip.GetResourceData ();
233-
fs.Write (data, 0, data.Length);
234-
}
235-
236-
// temporarily extracted directory will look like:
237-
// __library_projects__/[dllname]/[library_project_imports | jlibs]/bin
238-
using (var zip = MonoAndroidHelper.ReadZipFile (finfo.FullName))
239-
Files.ExtractAll (zip, outDirForDll);
240-
241-
// We used to *copy* the resources to overwrite other resources,
242-
// which resulted in missing resource issue.
243-
// Here we replaced copy with use of '-S' option and made it to work.
244-
#if SEPARATE_CRUNCH
245-
// FIXME: review these binResDir/binAssemblyDir thing and enable this. Eclipse does this.
246-
// Enabling these blindly causes build failure on ActionBarSherlock.
247-
if (Directory.Exists (binResDir))
248-
resolvedResourceDirectories.Add (binResDir);
249-
if (Directory.Exists (binAssemblyDir))
250-
resolvedAssetDirectories.Add (binAssemblyDir);
251-
#endif
252-
if (Directory.Exists (resDir))
253-
resolvedResourceDirectories.Add (resDir);
254-
if (Directory.Exists (assemblyDir))
255-
resolvedAssetDirectories.Add (assemblyDir);
256-
257-
finfo.Delete ();
258-
}
274+
finfo.Delete ();
259275
}
276+
}
260277

278+
if (Directory.Exists (importsDir))
261279
stamp.Create ().Close ();
262-
}
263280
}
264281

265282
foreach (var f in outdir.GetFiles ("*.jar")

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using NUnit.Framework;
44
using System.IO;
55
using System.Linq;
6+
using System.Collections.Generic;
67

78
namespace Xamarin.Android.Build.Tests
89
{
@@ -263,7 +264,7 @@ public void BindngFilterUnsupportedNativeAbiLibraries ()
263264
}
264265

265266
[Test]
266-
public void BindingCheckHiddenFiles ()
267+
public void BindingCheckHiddenFiles ([Values (true, false)] bool useShortFileNames)
267268
{
268269
var binding = new XamarinAndroidBindingProject () {
269270
UseLatestPlatformSdk = true,
@@ -273,15 +274,31 @@ public void BindingCheckHiddenFiles ()
273274
binding.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\mylibrary.aar") {
274275
WebContent = "https://www.dropbox.com/s/astiqp8jo97x91h/mylibrary.aar?dl=1"
275276
});
277+
binding.SetProperty (binding.ActiveConfigurationProperties, "UseShortFileNames", useShortFileNames);
276278
using (var bindingBuilder = CreateDllBuilder (Path.Combine ("temp", "BindingCheckHiddenFiles", "Binding"))) {
277279
bindingBuilder.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Diagnostic;
278280
Assert.IsTrue (bindingBuilder.Build (binding), "binding build should have succeeded");
279281
var proj = new XamarinAndroidApplicationProject ();
280282
proj.OtherBuildItems.Add (new BuildItem ("ProjectReference", "..\\Binding\\UnnamedProject.csproj"));
283+
proj.SetProperty (proj.ActiveConfigurationProperties, "UseShortFileNames", useShortFileNames);
281284
using (var b = CreateApkBuilder (Path.Combine ("temp", "BindingCheckHiddenFiles", "App"))) {
282285
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
283-
var dsStorePath = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "__library_projects__",
284-
"UnnamedProject", "library_project_imports");
286+
var assemblyMap = b.Output.GetIntermediaryPath (Path.Combine ("lp", "map.cache"));
287+
if (useShortFileNames)
288+
Assert.IsTrue (File.Exists (assemblyMap), $"{assemblyMap} should exist.");
289+
else
290+
Assert.IsFalse (File.Exists (assemblyMap), $"{assemblyMap} should not exist.");
291+
var assemblyIdentityMap = new List<string> ();
292+
if (useShortFileNames) {
293+
foreach (var s in File.ReadLines (assemblyMap)) {
294+
assemblyIdentityMap.Add (s);
295+
}
296+
}
297+
var assmeblyIdentity = useShortFileNames ? assemblyIdentityMap.IndexOf ("UnnamedProject").ToString () : "UnnamedProject";
298+
var libaryImportsFolder = useShortFileNames ? "lp" : "__library_projects__";
299+
var jlibs = useShortFileNames ? "jl" : "library_project_imports";
300+
var dsStorePath = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, libaryImportsFolder,
301+
assmeblyIdentity, jlibs);
285302
Assert.IsTrue (Directory.Exists (dsStorePath), "{0} should exist.", dsStorePath);
286303
Assert.IsFalse (File.Exists (Path.Combine (dsStorePath, ".DS_Store")), "{0} should NOT exist.",
287304
Path.Combine (dsStorePath, ".DS_Store"));

0 commit comments

Comments
 (0)